|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 24670 (0x605e)
Types: TextFile
Names: »mosy.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/others/mosy/mosy.c«
/* mosy.c - Managed Object Syntax-compiler (yacc-based) */
#ifndef lint
static char *rcsid = "$Header: /f/osi/others/mosy/RCS/mosy.c,v 7.0 89/11/23 22:00:38 mrose Rel $";
#endif
/*
* $Header: /f/osi/others/mosy/RCS/mosy.c,v 7.0 89/11/23 22:00:38 mrose Rel $
*
*
* $Log: mosy.c,v $
* Revision 7.0 89/11/23 22:00:38 mrose
* Release 6.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
#include <ctype.h>
#include <stdio.h>
#include <varargs.h>
#define pepyversion mosyversion
#include "mosy-defs.h"
/* \f
DATA */
int Cflag = 0; /* mosy */
int dflag = 0;
int Pflag = 0; /* pepy compat... */
int doexternals;
static int linepos = 0;
static int mflag = 0;
static int mosydebug = 0;
static int sflag = 0;
static char *eval = NULLCP;
char *mymodule = "";
OID mymoduleid;
int yysection = NULL;
char *yyencpref = "none";
char *yydecpref = "none";
char *yyprfpref = "none";
char *yyencdflt = "none";
char *yydecdflt = "none";
char *yyprfdflt = "none";
static char *yymode = "";
static char *classes[] = {
"UNIVERSAL ",
"APPLICATION ",
"",
"PRIVATE "
};
static char autogen[BUFSIZ];
char *sysin = NULLCP;
static char sysout[BUFSIZ];
/* \f
*/
typedef struct yot {
char *yo_name;
YP yo_syntax;
YV yo_value;
char *yo_access;
char *yo_status;
} yot, *OT;
#define NULLOT ((OT) 0)
typedef struct yoi {
char *yi_name;
YV yi_value;
} yoi, *OI;
#define NULLOI ((OI) 0)
/* \f
*/
typedef struct symlist {
char *sy_encpref;
char *sy_decpref;
char *sy_prfpref;
char *sy_module;
char *sy_name;
union {
OT sy_un_yo;
OI sy_un_yi;
YP sy_un_yp;
} sy_un;
#define sy_yo sy_un.sy_un_yo
#define sy_yi sy_un.sy_un_yi
#define sy_yp sy_un.sy_un_yp
struct symlist *sy_next;
} symlist, *SY;
#define NULLSY ((SY) 0)
static SY myobjects = NULLSY;
static SY myidentifiers = NULLSY;
static SY mytypes = NULLSY;
char *modsym ();
SY new_symbol (), add_symbol ();
char *id2str ();
YP lookup_type ();
char *val2str ();
/* \f
MAIN */
/* ARGSUSED */
main (argc, argv, envp)
int argc;
char **argv,
**envp;
{
register char *cp,
*sp;
fprintf (stderr, "%s\n", mosyversion);
sysout[0] = NULL;
for (argc--, argv++; argc > 0; argc--, argv++) {
cp = *argv;
if (strcmp (cp, "-d") == 0) {
dflag++;
continue;
}
if (strcmp (cp, "-m") == 0) {
mflag++;
continue;
}
if (strcmp (cp, "-o") == 0) {
if (sysout[0]) {
fprintf (stderr, "too many output files\n");
exit (1);
}
argc--, argv++;
if ((cp = *argv) == NULL || (*cp == '-' && cp[1] != NULL))
goto usage;
(void) strcpy (sysout, cp);
continue;
}
if (strcmp (cp, "-s") == 0) {
sflag++;
continue;
}
if (sysin) {
usage: ;
fprintf (stderr,
"usage: mosy [-d] [-o module.defs] [-s] module.my\n");
exit (1);
}
if (*cp == '-') {
if (*++cp != NULL)
goto usage;
sysin = "";
}
sysin = cp;
if (sysout[0])
continue;
if (sp = rindex (cp, '/'))
sp++;
if (sp == NULL || *sp == NULL)
sp = cp;
sp += strlen (cp = sp) - 3;
if (sp > cp && strcmp (sp, ".my") == 0)
(void) sprintf (sysout, "%.*s.defs", sp - cp, cp);
else
(void) sprintf (sysout, "%s.defs", cp);
}
switch (mosydebug = (cp = getenv ("MOSYTEST")) && *cp ? atoi (cp) : 0) {
case 2:
yydebug++; /* fall */
case 1:
sflag++; /* .. */
case 0:
break;
}
if (sysin == NULLCP)
sysin = "";
if (*sysin && freopen (sysin, "r", stdin) == NULL) {
fprintf (stderr, "unable to read "), perror (sysin);
exit (1);
}
if (strcmp (sysout, "-") == 0)
sysout[0] = NULL;
if (*sysout && freopen (sysout, "w", stdout) == NULL) {
fprintf (stderr, "unable to write "), perror (sysout);
exit (1);
}
if (cp = index (mosyversion, ')'))
for (cp++; *cp != ' '; cp++)
if (*cp == NULL) {
cp = NULL;
break;
}
if (cp == NULL)
cp = mosyversion + strlen (mosyversion);
(void) sprintf (autogen, "%*.*s",
cp - mosyversion, cp - mosyversion, mosyversion);
printf ("-- automatically generated by %s, do not edit!\n\n", autogen);
initoidtbl ();
exit (yyparse ()); /* NOTREACHED */
}
/* \f
ERRORS */
yyerror (s)
register char *s;
{
yyerror_aux (s);
if (*sysout)
(void) unlink (sysout);
exit (1);
}
#ifndef lint
warning (va_alist)
va_dcl
{
char buffer[BUFSIZ];
char buffer2[BUFSIZ];
char *cp;
va_list ap;
va_start (ap);
_asprintf (buffer, NULLCP, ap);
va_end (ap);
(void) sprintf (buffer2, "Warning: %s", buffer);
yyerror_aux (buffer2);
}
#else
/* VARARGS1 */
warning (fmt)
char *fmt;
{
warning (fmt);
}
#endif
static yyerror_aux (s)
register char *s;
{
if (linepos)
fprintf (stderr, "\n"), linepos = 0;
if (eval)
fprintf (stderr, "%s %s: ", yymode, eval);
else
fprintf (stderr, "line %d: ", yylineno);
fprintf (stderr, "%s\n", s);
if (!eval)
fprintf (stderr, "last token read was \"%s\"\n", yytext);
}
/* \f
*/
#ifndef lint
myyerror (va_alist)
va_dcl
{
char buffer[BUFSIZ];
va_list ap;
va_start (ap);
_asprintf (buffer, NULLCP, ap);
va_end (ap);
yyerror (buffer);
}
#else
/* VARARGS */
myyerror (fmt)
char *fmt;
{
myyerror (fmt);
}
#endif
/* \f
*/
yywrap () {
if (linepos)
fprintf (stderr, "\n"), linepos = 0;
return 1;
}
/* \f
*/
/* ARGSUSED */
yyprint (s, f, top)
char *s;
int f,
top;
{
}
static yyprint_aux (s, mode)
char *s,
*mode;
{
int len;
static int nameoutput = 0;
static int outputlinelen = 79;
if (sflag)
return;
if (strcmp (yymode, mode)) {
if (linepos)
fprintf (stderr, "\n\n");
fprintf (stderr, "%s", mymodule);
nameoutput = (linepos = strlen (mymodule)) + 1;
fprintf (stderr, " %ss", yymode = mode);
linepos += strlen (yymode) + 1;
fprintf (stderr, ":");
linepos += 2;
}
len = strlen (s);
if (linepos != nameoutput)
if (len + linepos + 1 > outputlinelen)
fprintf (stderr, "\n%*s", linepos = nameoutput, "");
else
fprintf (stderr, " "), linepos++;
fprintf (stderr, "%s", s);
linepos += len;
}
/* \f
PASS1 */
pass1 ()
{
printf ("-- object definitions compiled from %s", mymodule);
if (mymoduleid)
printf (" %s", oidprint(mymoduleid));
printf ("\n\n");
}
/* \f
*/
pass1_oid (mod, id, value)
char *mod,
*id;
YV value;
{
register SY sy;
register OI yi;
if ((yi = (OI) calloc (1, sizeof *yi)) == NULLOI)
yyerror ("out of memory");
yi -> yi_name = id;
yi -> yi_value = value;
if (mosydebug) {
if (linepos)
fprintf (stderr, "\n"), linepos = 0;
fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
print_yi (yi, 0);
fprintf (stderr, "--------\n");
}
else
yyprint_aux (id, "identifier");
sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id);
sy -> sy_yi = yi;
myidentifiers = add_symbol (myidentifiers, sy);
}
/* \f
*/
pass1_obj (mod, id, syntax, value, aname, sname)
char *mod,
*id,
*aname,
*sname;
YP syntax;
YV value;
{
register SY sy;
register OT yo;
if ((yo = (OT) calloc (1, sizeof *yo)) == NULLOT)
yyerror ("out of memory");
yo -> yo_name = id;
yo -> yo_syntax = syntax;
yo -> yo_value = value;
yo -> yo_access = aname;
yo -> yo_status = sname;
if (mosydebug) {
if (linepos)
fprintf (stderr, "\n"), linepos = 0;
fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
print_yo (yo, 0);
fprintf (stderr, "--------\n");
}
else
yyprint_aux (id, "object");
sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id);
sy -> sy_yo = yo;
myobjects = add_symbol (myobjects, sy);
}
/* \f
*/
pass1_type (encpref, decpref, prfpref, mod, id, yp)
register char *encpref,
*decpref,
*prfpref,
*mod,
*id;
register YP yp;
{
register SY sy;
if (dflag && lookup_type (mod, id)) /* no duplicate entries, please... */
return;
if (mosydebug) {
if (linepos)
fprintf (stderr, "\n"), linepos = 0;
fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
print_type (yp, 0);
fprintf (stderr, "--------\n");
}
else
if (!(yp -> yp_flags & YP_IMPORTED))
yyprint_aux (id, "type");
sy = new_symbol (encpref, decpref, prfpref, mod, id);
sy -> sy_yp = yp;
mytypes = add_symbol (mytypes, sy);
}
/* \f
PASS2 */
pass2 () {
register SY sy;
register YP yp;
if (!sflag)
(void) fflush (stderr);
yymode = "identifiers";
for (sy = myidentifiers; sy; sy = sy -> sy_next) {
if (sy -> sy_module == NULLCP)
yyerror ("no module name associated with symbol");
do_id (sy -> sy_yi, eval = sy -> sy_name);
}
if (myidentifiers)
printf ("\n");
yymode = "objects";
for (sy = myobjects; sy; sy = sy -> sy_next) {
if (sy -> sy_module == NULLCP)
yyerror ("no module name associated with symbol");
do_obj1 (sy -> sy_yo, eval = sy -> sy_name);
}
if (myobjects)
printf ("\n\n");
(void) fflush (stdout);
if (ferror (stdout))
myyerror ("write error - %s", sys_errname (errno));
}
/* \f
*/
/* ARGSUSED */
static do_id (yi, id)
register OI yi;
char *id;
{
printf ("%-20s %s\n", yi -> yi_name, id2str (yi -> yi_value));
}
/* \f
*/
/* ARGSUSED */
static do_obj1 (yo, id)
register OT yo;
char *id;
{
register YP yp,
yz;
printf ("%-20s %-16s ", yo -> yo_name, id2str (yo -> yo_value));
if ((yp = yo -> yo_syntax) == NULLYP)
yyerror ("no syntax associated with object type");
switch (yp -> yp_code) {
case YP_INT:
case YP_INTLIST:
id = "INTEGER";
break;
case YP_OCT:
id = "OctetString";
break;
case YP_OID:
id = "ObjectID";
break;
case YP_NULL:
id = "NULL";
break;
default:
#ifdef notdef
yp = new_type (YP_IDEFINED);
yp -> yp_identifier = new_string (yo -> yo_name);
yp -> yp_identifier[0] = toupper (yp -> yp_identifier[0]);
if (lookup_type (mymodule, yp -> yp_identifier))
yyerror ("unable to create inline type for object's syntax");
pass1_type (yyencpref, yydecpref, yyprfpref, mymodule,
new_string (yp -> yp_identifier),
yo -> yo_syntax = yp);
#endif
id = "Aggregate";
break;
case YP_IDEFINED:
yz = lookup_type (yp -> yp_module, yp -> yp_identifier);
again: ;
switch (yz ? yz -> yp_code : YP_UNDF) {
case YP_UNDF:
case YP_INT:
case YP_INTLIST:
case YP_OCT:
case YP_OID:
case YP_NULL:
id = yp -> yp_identifier;
break;
case YP_IDEFINED:
yz = lookup_type (yz -> yp_module, yz -> yp_identifier);
goto again;
default:
id = "Aggregate";
break;
}
break;
}
printf ("%-15s %-15s %s\n", id, yo -> yo_access, yo -> yo_status);
}
/* \f
IDENTIFIER HANDLING */
static char *id2str (yv)
register YV yv;
{
register char *cp,
*dp;
static char buffer[BUFSIZ];
if (yv -> yv_code != YV_OIDLIST)
yyerror ("need an object identifer");
cp = buffer;
for (yv = yv -> yv_idlist, dp = ""; yv; yv = yv -> yv_next, dp = ".") {
(void) sprintf (cp, "%s%s", dp, val2str (yv));
cp += strlen (cp);
}
*cp = NULL;
return buffer;
}
/* \f
TYPE HANDLING */
static YP lookup_type (mod, id)
register char *mod,
*id;
{
register SY sy;
for (sy = mytypes; sy; sy = sy -> sy_next) {
if (mod) {
if (strcmp (sy -> sy_module, mod))
continue;
}
else
if (strcmp (sy -> sy_module, mymodule)
&& strcmp (sy -> sy_module, "UNIV"))
continue;
if (strcmp (sy -> sy_name, id) == 0)
return sy -> sy_yp;
}
return NULLYP;
}
/* \f
VALUE HANDLING */
static char *val2str (yv)
register YV yv;
{
static char buffer[BUFSIZ];
switch (yv -> yv_code) {
case YV_BOOL:
yyerror ("need a sub-identifier, not a boolean");
case YV_NUMBER:
(void) sprintf (buffer, "%d", yv -> yv_number);
return buffer;
case YV_STRING:
yyerror ("need a sub-identifier, not a string");
case YV_IDEFINED:
return yv -> yv_identifier;
case YV_IDLIST:
yyerror ("haven't written symbol table for values yet");
case YV_VALIST:
yyerror ("need a sub-identifier, not a list of values");
case YV_OIDLIST:
yyerror ("need a sub-identifier, not an object identifier");
case YV_NULL:
yyerror ("need a sub-identifier, not NULL");
default:
myyerror ("unknown value: %d", yv -> yv_code);
}
/* NOTREACHED */
}
/* \f
*/
static int val2int (yv)
register YV yv;
{
switch (yv -> yv_code) {
case YV_BOOL:
case YV_NUMBER:
return yv -> yv_number;
case YV_STRING:
yyerror ("need an integer, not a string");
case YV_IDEFINED:
case YV_IDLIST:
yyerror ("haven't written symbol table for values yet");
case YV_VALIST:
yyerror ("need an integer, not a list of values");
case YV_OIDLIST:
yyerror ("need an integer, not an object identifier");
case YV_NULL:
yyerror ("need an integer, not NULL");
default:
myyerror ("unknown value: %d", yv -> yv_code);
}
/* NOTREACHED */
}
/* \f
*/
static val2prf (yv, level)
register YV yv;
int level;
{
register YV y;
if (yv -> yv_flags & YV_ID)
printf ("%s ", yv -> yv_id);
#ifdef notdef
if (yv -> yv_flags & YV_TYPE) /* will this REALLY work??? */
do_type (yv -> yv_type, level, NULLCP);
#endif
switch (yv -> yv_code) {
case YV_BOOL:
printf (yv -> yv_number ? "TRUE" : "FALSE");
break;
case YV_NUMBER:
if (yv -> yv_named)
printf ("%s", yv -> yv_named);
else
printf ("%d", yv -> yv_number);
break;
case YV_STRING:
printf ("\"%s\"", yv -> yv_string);
break;
case YV_IDEFINED:
if (yv -> yv_module)
printf ("%s.", yv -> yv_module);
printf ("%s", yv -> yv_identifier);
break;
case YV_IDLIST:
case YV_VALIST:
printf ("{");
for (y = yv -> yv_idlist; y; y = y -> yv_next) {
printf (" ");
val2prf (y, level + 1);
printf (y -> yv_next ? ", " : " ");
}
printf ("}");
break;
case YV_OIDLIST:
printf ("{");
for (y = yv -> yv_idlist; y; y = y -> yv_next) {
printf (" ");
val2prf (y, level + 1);
printf (" ");
}
printf ("}");
break;
case YV_NULL:
printf ("NULL");
break;
default:
myyerror ("unknown value: %d", yv -> yv_code);
/* NOTREACHED */
}
}
/* \f
ACTION HANDLING */
static act2prf (cp, level, e1, e2)
char *cp,
*e1,
*e2;
int level;
{
register int i,
j,
l4;
register char *dp,
*ep,
*fp;
char *gp;
if (e1)
printf (e1, level * 4, "");
if (!(ep = index (dp = cp, '\n'))) {
printf ("%s", dp);
goto out;
}
for (;;) {
i = expand (dp, ep, &gp);
if (gp) {
if (i == 0)
printf ("%*.*s\n", ep - dp, ep - dp, dp);
else
break;
}
if (!(ep = index (dp = ep + 1, '\n'))) {
printf ("%s", dp);
return;
}
}
printf ("\n");
l4 = (level + 1) * 4;
for (; *dp; dp = fp) {
if (ep = index (dp, '\n'))
fp = ep + 1;
else
fp = ep = dp + strlen (dp);
j = expand (dp, ep, &gp);
if (gp == NULL) {
if (*fp)
printf ("\n");
continue;
}
if (j < i)
j = i;
if (j)
printf ("%*s", l4 + j - i, "");
printf ("%*.*s\n", ep - gp, ep - gp, gp);
}
printf ("%*s", level * 4, "");
out: ;
if (e2)
printf (e2, level * 4, "");
}
static expand (dp, ep, gp)
register char *dp,
*ep;
char **gp;
{
register int i;
*gp = NULL;
for (i = 0; dp < ep; dp++) {
switch (*dp) {
case ' ':
i++;
continue;
case '\t':
i += 8 - (i % 8);
continue;
default:
*gp = dp;
break;
}
break;
}
return i;
}
/* \f
DEBUG */
static print_yo (yo, level)
register OT yo;
register int level;
{
if (yo == NULLOT)
return;
fprintf (stderr, "%*sname=%s\n", level * 4, "", yo -> yo_name);
if (yo -> yo_syntax) {
fprintf (stderr, "%*ssyntax\n", level * 4, "");
print_type (yo -> yo_syntax, level + 1);
}
if (yo -> yo_value) {
fprintf (stderr, "%*svalue\n", level * 4, "");
print_value (yo -> yo_value, level + 1);
}
}
/* \f
*/
static print_yi (yi, level)
register OI yi;
register int level;
{
if (yi == NULLOI)
return;
fprintf (stderr, "%*sname=%s\n", level * 4, "", yi -> yi_name);
if (yi -> yi_value) {
fprintf (stderr, "%*svalue\n", level * 4, "");
print_value (yi -> yi_value, level + 1);
}
}
/* \f
*/
static print_type (yp, level)
register YP yp;
register int level;
{
register YP y;
register YV yv;
if (yp == NULLYP)
return;
fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
yp -> yp_code, sprintb (yp -> yp_flags, YPBITS));
fprintf (stderr,
"%*sintexp=\"%s\" strexp=\"%s\" prfexp=%c declexp=\"%s\" varexp=\"%s\"\n",
level * 4, "", yp -> yp_intexp, yp -> yp_strexp, yp -> yp_prfexp,
yp -> yp_declexp, yp -> yp_varexp);
fprintf(stderr,
"%*sstructname=\"%s\" ptrname=\"%s\"\n", level * 4, "",
yp -> yp_structname, yp -> yp_ptrname);
if (yp -> yp_action0)
fprintf (stderr, "%*saction0 at line %d=\"%s\"\n", level * 4, "",
yp -> yp_act0_lineno, yp -> yp_action0);
if (yp -> yp_action1)
fprintf (stderr, "%*saction1 at line %d=\"%s\"\n", level * 4, "",
yp -> yp_act1_lineno, yp -> yp_action1);
if (yp -> yp_action2)
fprintf (stderr, "%*saction2 at line %d=\"%s\"\n", level * 4, "",
yp -> yp_act2_lineno, yp -> yp_action2);
if (yp -> yp_action3)
fprintf (stderr, "%*saction3 at line %d=\"%s\"\n", level * 4, "",
yp -> yp_act3_lineno, yp -> yp_action3);
if (yp -> yp_flags & YP_TAG) {
fprintf (stderr, "%*stag class=0x%x value=0x%x\n", level * 4, "",
yp -> yp_tag -> yt_class, yp -> yp_tag -> yt_value);
print_value (yp -> yp_tag -> yt_value, level + 1);
}
if (yp -> yp_flags & YP_DEFAULT) {
fprintf (stderr, "%*sdefault=0x%x\n", level * 4, "", yp -> yp_default);
print_value (yp -> yp_default, level + 1);
}
if (yp -> yp_flags & YP_ID)
fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yp -> yp_id);
if (yp -> yp_flags & YP_BOUND)
fprintf (stderr, "%*sbound=\"%s\"\n", level * 4, "", yp -> yp_bound);
if (yp -> yp_offset)
fprintf (stderr, "%*soffset=\"%s\"\n", level * 4, "", yp -> yp_offset);
switch (yp -> yp_code) {
case YP_INTLIST:
case YP_BITLIST:
fprintf (stderr, "%*svalue=0x%x\n", level * 4, "", yp -> yp_value);
for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
print_value (yv, level + 1);
fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
}
break;
case YP_SEQTYPE:
case YP_SEQLIST:
case YP_SETTYPE:
case YP_SETLIST:
case YP_CHOICE:
fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yp -> yp_type);
for (y = yp -> yp_type; y; y = y -> yp_next) {
print_type (y, level + 1);
fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
}
break;
case YP_IDEFINED:
fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
level * 4, "", yp -> yp_module ? yp -> yp_module : "",
yp -> yp_identifier);
break;
default:
break;
}
}
/* \f
*/
static print_value (yv, level)
register YV yv;
register int level;
{
register YV y;
if (yv == NULLYV)
return;
fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
yv -> yv_code, sprintb (yv -> yv_flags, YVBITS));
if (yv -> yv_action)
fprintf (stderr, "%*saction at line %d=\"%s\"\n", level * 4, "",
yv -> yv_act_lineno, yv -> yv_action);
if (yv -> yv_flags & YV_ID)
fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yv -> yv_id);
if (yv -> yv_flags & YV_NAMED)
fprintf (stderr, "%*snamed=\"%s\"\n", level * 4, "", yv -> yv_named);
if (yv -> yv_flags & YV_TYPE) {
fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yv -> yv_type);
print_type (yv -> yv_type, level + 1);
}
switch (yv -> yv_code) {
case YV_NUMBER:
case YV_BOOL:
fprintf (stderr, "%*snumber=0x%x\n", level * 4, "",
yv -> yv_number);
break;
case YV_STRING:
fprintf (stderr, "%*sstring=0x%x\n", level * 4, "",
yv -> yv_string);
break;
case YV_IDEFINED:
if (yv -> yv_flags & YV_BOUND)
fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
level * 4, "", yv -> yv_module, yv -> yv_identifier);
else
fprintf (stderr, "%*sbound identifier=\"%s\"\n",
level * 4, "", yv -> yv_identifier);
break;
case YV_IDLIST:
case YV_VALIST:
case YV_OIDLIST:
for (y = yv -> yv_idlist; y; y = y -> yv_next) {
print_value (y, level + 1);
fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
}
break;
default:
break;
}
}
/* \f
SYMBOLS */
static SY new_symbol (encpref, decpref, prfpref, mod, id)
register char *encpref,
*decpref,
*prfpref,
*mod,
*id;
{
register SY sy;
if ((sy = (SY) calloc (1, sizeof *sy)) == NULLSY)
yyerror ("out of memory");
sy -> sy_encpref = encpref;
sy -> sy_decpref = decpref;
sy -> sy_prfpref = prfpref;
sy -> sy_module = mod;
sy -> sy_name = id;
return sy;
}
static SY add_symbol (s1, s2)
register SY s1,
s2;
{
register SY sy;
if (s1 == NULLSY)
return s2;
for (sy = s1; sy -> sy_next; sy = sy -> sy_next)
continue;
sy -> sy_next = s2;
return s1;
}
/* \f
TYPES */
YP new_type (code)
int code;
{
register YP yp;
if ((yp = (YP) calloc (1, sizeof *yp)) == NULLYP)
yyerror ("out of memory");
yp -> yp_code = code;
return yp;
}
YP add_type (y1, y2)
register YP y1,
y2;
{
register YP yp;
for (yp = y1; yp -> yp_next; yp = yp -> yp_next)
continue;
yp -> yp_next = y2;
return y1;
}
/* \f
VALUES */
YV new_value (code)
int code;
{
register YV yv;
if ((yv = (YV) calloc (1, sizeof *yv)) == NULLYV)
yyerror ("out of memory");
yv -> yv_code = code;
return yv;
}
YV add_value (y1, y2)
register YV y1,
y2;
{
register YV yv;
for (yv = y1; yv -> yv_next; yv = yv -> yv_next)
continue;
yv -> yv_next = y2;
return y1;
}
/* \f
TAGS */
YT new_tag (class)
PElementClass class;
{
register YT yt;
if ((yt = (YT) calloc (1, sizeof *yt)) == NULLYT)
yyerror ("out of memory");
yt -> yt_class = class;
return yt;
}
/* \f
STRINGS */
char *new_string (s)
register char *s;
{
register char *p;
if ((p = malloc ((unsigned) (strlen (s) + 1))) == NULLCP)
yyerror ("out of memory");
(void) strcpy (p, s);
return p;
}
/* \f
SYMBOLS */
static struct triple {
char *t_name;
PElementClass t_class;
PElementID t_id;
} triples[] = {
"IA5String", PE_CLASS_UNIV, PE_DEFN_IA5S,
"ISO646String", PE_CLASS_UNIV, PE_DEFN_IA5S,
"NumericString", PE_CLASS_UNIV, PE_DEFN_NUMS,
"PrintableString", PE_CLASS_UNIV, PE_DEFN_PRTS,
"T61String", PE_CLASS_UNIV, PE_DEFN_T61S,
"TeletexString", PE_CLASS_UNIV, PE_DEFN_T61S,
"VideotexString", PE_CLASS_UNIV, PE_DEFN_VTXS,
"GeneralizedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
"GeneralisedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
"UTCTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
"UniversalTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
"GraphicString", PE_CLASS_UNIV, PE_DEFN_GFXS,
"VisibleString", PE_CLASS_UNIV, PE_DEFN_VISS,
"GeneralString", PE_CLASS_UNIV, PE_DEFN_GENS,
"EXTERNAL", PE_CLASS_UNIV, PE_CONS_EXTN,
"ObjectDescriptor", PE_CLASS_UNIV, PE_PRIM_ODE,
NULL
};
/* \f
*/
static char *modsym (module, id, prefix)
register char *module,
*id;
char *prefix;
{
char buf1[BUFSIZ],
buf2[BUFSIZ],
buf3[BUFSIZ];
register struct triple *t;
static char buffer[BUFSIZ];
if (module == NULLCP)
for (t = triples; t -> t_name; t++)
if (strcmp (t -> t_name, id) == 0) {
module = "UNIV";
break;
}
if (prefix)
modsym_aux (prefix, buf1);
modsym_aux (module ? module : mymodule, buf2);
modsym_aux (id, buf3);
if (prefix)
(void) sprintf (buffer, "%s_%s_%s", buf1, buf2, buf3);
else
(void) sprintf (buffer, "%s_%s", buf2, buf3);
return buffer;
}
static modsym_aux (name, bp)
register char *name,
*bp;
{
register char c;
while (c = *name++)
switch (c) {
case '-':
*bp++ = '_';
*bp++ = '_';
break;
default:
*bp++ = c;
break;
}
*bp = NULL;
}