Annotation of 43BSDReno/contrib/isode-beta/pepsy/pepsy.c, revision 1.1

1.1     ! root        1: /* pepsy.c - table driven posy/pepy replacement system */
        !             2: 
        !             3: /* OPEN QUESTIONS:
        !             4: 
        !             5:        How to do smarter DEFAULT determination for the other types and NULLs
        !             6: 
        !             7:        Perhaps pull-up primitive IDentifiers
        !             8: 
        !             9:        Abort a CHOICE encoding if the structure is empty
        !            10: 
        !            11: 
        !            12:                                  HEURISTICS
        !            13: 
        !            14:    1. LANGUAGE SIMPLIFICATIONS:
        !            15: 
        !            16: 
        !            17:        Pull-up uni-member SEQUENCEs/SETs/CHOICEs
        !            18: 
        !            19: 
        !            20:    2. LANGUAGE ASSUMPTIONS:
        !            21: 
        !            22:        Unique tags to avoid conflicts for internal structures (-h1 option)
        !            23: 
        !            24: 
        !            25:    3. STYLE ISSUES:
        !            26: 
        !            27:        SEQUENCE/SET OF Type should have Type be an ID for nicer naming
        !            28:  */
        !            29: 
        !            30: #ifndef        lint
        !            31: static char *rcsid = "$Header: /f/osi/pepsy/RCS/pepsy.c,v 7.1 90/07/09 14:52:50 mrose Exp $";
        !            32: #endif
        !            33: 
        !            34: /*
        !            35:  * $Header: /f/osi/pepsy/RCS/pepsy.c,v 7.1 90/07/09 14:52:50 mrose Exp $
        !            36:  *
        !            37:  *
        !            38:  * $Log:       pepsy.c,v $
        !            39:  * Revision 7.1  90/07/09  14:52:50  mrose
        !            40:  * sync
        !            41:  * 
        !            42:  * Revision 7.0  90/07/01  19:54:25  mrose
        !            43:  * *** empty log message ***
        !            44:  * 
        !            45:  * Revision 7.3  90/02/23  17:50:09  mrose
        !            46:  * update
        !            47:  * 
        !            48:  * Revision 7.2  90/02/19  13:09:35  mrose
        !            49:  * update
        !            50:  * 
        !            51:  * Revision 7.1  90/01/11  18:37:05  mrose
        !            52:  * real-sync
        !            53:  * 
        !            54:  * Revision 7.0  89/11/23  22:11:59  mrose
        !            55:  * Release 6.0
        !            56:  * 
        !            57:  */
        !            58: 
        !            59: /*
        !            60:  *                               NOTICE
        !            61:  *
        !            62:  *    Acquisition, use, and distribution of this module and related
        !            63:  *    materials are subject to the restrictions of a license agreement.
        !            64:  *    Consult the Preface in the User's Manual for the full terms of
        !            65:  *    this agreement.
        !            66:  *
        !            67:  */
        !            68: 
        !            69: 
        !            70: #include <ctype.h>
        !            71: #include <stdio.h>
        !            72: #include <varargs.h>
        !            73: #include "pepsydefs.h"
        !            74: #include "pass2.h"
        !            75: 
        !            76: 
        !            77: #define        SVAL(s)         ((s) ? (s) : "")
        !            78: #define PARVAL(s)      ((s) ? (s) : "parm")
        !            79: 
        !            80: /*    DATA */
        !            81: 
        !            82: static int aflag = 0;
        !            83: int    Aflag = 0;      /* Don't so all modes by default */
        !            84: int    Cflag = 0;              /* posy */
        !            85: int    dflag = 0;
        !            86: int    Pflag = 0;              /* pepy compat ... */
        !            87: char    *bflag = NULL;         /*  .. */
        !            88: char    *module_actions = NULL;
        !            89: int    pepydebug = 0;
        !            90: int    doexternals = 1;
        !            91: static int fflag = 0;
        !            92: static int linepos = 0;
        !            93: static int mflag = 0;
        !            94: int sflag = 0;
        !            95: 
        !            96: int p_debug = 3;
        !            97: int options[NOPTIONS];
        !            98: 
        !            99: char *eval = NULLCP;
        !           100: 
        !           101: char   *mymodule = "";
        !           102: OID    mymoduleid = NULLOID;
        !           103: static char modulename[BUFSIZ];
        !           104: 
        !           105: int yysection = YP_DECODER;
        !           106: char *yyencpref = "encode";
        !           107: char *yydecpref = "decode";
        !           108: char *yyprfpref = "print";
        !           109: char *yyencdflt = "encode";
        !           110: char *yydecdflt = "decode";
        !           111: char *yyprfdflt = "print";
        !           112: 
        !           113: static char *classes[] = {
        !           114:     "UNIVERSAL ",
        !           115:     "APPLICATION ",
        !           116:     "",
        !           117:     "PRIVATE "
        !           118: };
        !           119: 
        !           120: static char *tags[] = {
        !           121:     "", "BOOLEAN", "INTEGER", "INTEGER", "BIT STRING", "BIT STRING",
        !           122:     "OCTET STRING", "NULL", "SEQUENCE", "SEQUENCE OF", "SEQUENCE",  "SET",
        !           123:     "SET OF", "SET", "CHOICE", "ANY", "OBJECT IDENTIFIER", "",
        !           124: 
        !           125:     NULL
        !           126: };
        !           127: 
        !           128: struct tuple tuples[] = {
        !           129:        YP_BOOL, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_BOOL",
        !           130:                PE_CLASS_UNIV, PE_PRIM_BOOL,
        !           131:        YP_INT, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_INT",
        !           132:                PE_CLASS_UNIV, PE_PRIM_INT,
        !           133:        YP_INTLIST, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_INT",
        !           134:                PE_CLASS_UNIV, PE_PRIM_INT,
        !           135:        YP_BIT, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_BITS",
        !           136:                PE_CLASS_UNIV, PE_PRIM_BITS,
        !           137:        YP_BITLIST, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_BITS",
        !           138:                PE_CLASS_UNIV, PE_PRIM_BITS,
        !           139:        YP_OCT, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_OCTS",
        !           140:                PE_CLASS_UNIV, PE_PRIM_OCTS,
        !           141:        YP_NULL, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_NULL",
        !           142:                PE_CLASS_UNIV, PE_PRIM_NULL,
        !           143:        YP_OID, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_OID",
        !           144:                PE_CLASS_UNIV, PE_PRIM_OID,
        !           145:        YP_SEQ, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SEQ",
        !           146:                PE_CLASS_UNIV, PE_CONS_SEQ,
        !           147:        YP_SEQTYPE, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SEQ",
        !           148:                PE_CLASS_UNIV, PE_CONS_SEQ,
        !           149:        YP_SEQLIST, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SEQ",
        !           150:                PE_CLASS_UNIV, PE_CONS_SEQ,
        !           151:        YP_SET, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SET",
        !           152:                PE_CLASS_UNIV, PE_CONS_SET,
        !           153:        YP_SETTYPE, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SET",
        !           154:                PE_CLASS_UNIV, PE_CONS_SET,
        !           155:        YP_SETLIST, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SET",
        !           156:                PE_CLASS_UNIV, PE_CONS_SET,
        !           157:        YP_ENUMLIST, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_ENUM",
        !           158:                PE_CLASS_UNIV, PE_PRIM_ENUM,
        !           159:        YP_REAL,     "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_REAL",
        !           160:                PE_CLASS_UNIV, PE_PRIM_REAL,
        !           161: 
        !           162:        YP_UNDF
        !           163: };
        !           164: 
        !           165: 
        !           166: static char autogen[BUFSIZ];
        !           167: 
        !           168: char   *sysin = NULLCP;
        !           169: static char sysout[BUFSIZ];
        !           170: static char sysdef[BUFSIZ];
        !           171: static char sysact[BUFSIZ];
        !           172: 
        !           173: #if 0
        !           174: static FILE *fact;
        !           175: #endif
        !           176: static FILE *fdef;
        !           177: 
        !           178: typedef struct modlist {
        !           179:     char   *md_module;
        !           180:     OID    md_oid;
        !           181:     int           md_flags;
        !           182: #define MDF_SEEN               1       /* Seen this module */
        !           183: 
        !           184:     struct modlist *md_next;
        !           185: }              modlist, *MD;
        !           186: #define        NULLMD  ((MD) 0)
        !           187: 
        !           188: static  MD     mymodules = NULLMD;
        !           189: 
        !           190: typedef struct symlist {
        !           191:     char   *sy_encpref;
        !           192:     char   *sy_decpref;
        !           193:     char   *sy_prfpref;
        !           194:     char   *sy_module;
        !           195:     char   *sy_name;
        !           196: 
        !           197:     YP     sy_type;
        !           198: 
        !           199:     struct symlist *sy_next;
        !           200: }              symlist, *SY;
        !           201: #define        NULLSY  ((SY) 0)
        !           202: 
        !           203: SY     mysymbols = NULLSY;
        !           204: 
        !           205: 
        !           206: char   *gensym (), *modsym (), *array ();
        !           207: extern char    *my_strcat(), *gfree(), *concat(), *my_new_str();
        !           208: MD     lookup_module ();
        !           209: SY     new_symbol (), add_symbol ();
        !           210: static double val2real ();
        !           211: static void prime_default ();
        !           212: 
        !           213: FILE   *open_ph_file ();
        !           214: 
        !           215: YP     lookup_type ();
        !           216: 
        !           217: YT  lookup_tag ();
        !           218: 
        !           219: /*    MAIN */
        !           220: 
        !           221: /* ARGSUSED */
        !           222: 
        !           223: main (argc, argv, envp)
        !           224: int    argc;
        !           225: char  **argv,
        !           226:       **envp;
        !           227: {
        !           228:     int            i;
        !           229:     register char  *cp,
        !           230:                   *dp;
        !           231: 
        !           232:     dp = pepsyversion + strlen ("pepsy ");
        !           233:     (void) fprintf (stderr, "pepsy %s\n", dp);
        !           234: 
        !           235:     sysout[0] = sysdef[0] = sysact[0] = NULL;
        !           236:     for (argc--, argv++; argc > 0; argc--, argv++) {
        !           237:        cp = *argv;
        !           238: 
        !           239:        if (strcmp (cp, "-A") == 0) {
        !           240:            Aflag++;
        !           241:            continue;
        !           242:        }
        !           243:        if (strcmp (cp, "-a") == 0) {
        !           244:            aflag++;
        !           245:            continue;
        !           246:        }
        !           247:        if (strcmp (cp, "-d") == 0) {
        !           248:            dflag++;
        !           249:            continue;
        !           250:        }
        !           251:        if (strcmp (cp, "-f") == 0) {
        !           252:            dflag++, fflag++;
        !           253:            continue;
        !           254:        }
        !           255:        if (strncmp (cp, "-h", 2) == 0) {
        !           256:            if (cp[2] == NULL) {
        !           257:                hflag++;
        !           258:                continue;
        !           259:            }
        !           260:            if (sscanf (cp + 2, "%d", &i) != 1 || i >= NOPTIONS)
        !           261:                goto usage;
        !           262:            hflag++, options[i]++;
        !           263:            continue;
        !           264:        }
        !           265:        if (strcmp (cp, "-m") == 0) {
        !           266:            mflag++;
        !           267:            continue;
        !           268:        }
        !           269:        if (strcmp (cp, "-s") == 0) {
        !           270:            sflag++;
        !           271:            continue;
        !           272:        }
        !           273: 
        !           274:        if (sysin) {
        !           275:     usage:  ;
        !           276:            (void) fprintf (stderr,
        !           277:                    "usage: pepsy [-A] [-a] [-d] [-f] [-h] [-s] module.py\n");
        !           278:            exit (1);
        !           279:        }
        !           280: 
        !           281:        if (*cp == '-') {
        !           282:            if (*++cp != NULL)
        !           283:                goto usage;
        !           284:            sysin = "";
        !           285:        }
        !           286:        sysin = cp;
        !           287:     }
        !           288: 
        !           289:     switch (pepydebug = (cp = getenv ("PEPSYTEST")) && *cp ? atoi (cp) : 0) {
        !           290:        case 2: 
        !           291:            yydebug++;          /* fall */
        !           292:        case 1: 
        !           293:            sflag++;            /*   .. */
        !           294:        case 0: 
        !           295:            break;
        !           296:     }
        !           297: 
        !           298:     if (sysin == NULLCP)
        !           299:        sysin = "";
        !           300: 
        !           301:     if (*sysin && freopen (sysin, "r", stdin) == NULL) {
        !           302:        (void) fprintf (stderr, "unable to read "), perror (sysin);
        !           303:        exit (1);
        !           304:     }
        !           305: 
        !           306:     if (strcmp (sysout, "-") == 0)
        !           307:        sysout[0] = NULL;
        !           308:     if (*sysout && freopen (sysout, "w", stdout) == NULL) {
        !           309:        (void) fprintf (stderr, "unable to write "), perror (sysout);
        !           310:        exit (1);
        !           311:     }
        !           312: 
        !           313:     if (cp = index (dp, ')')) {
        !           314:        for (cp++; *cp != ' '; cp++)
        !           315:            if (*cp == NULL)
        !           316:                break;
        !           317:        if (*cp == NULL)
        !           318:            cp = NULL;
        !           319:     }
        !           320:     if (cp == NULL)
        !           321:        cp = dp + strlen (dp);
        !           322:     (void) sprintf (autogen, "pepsy %*.*s", cp - dp, cp - dp, dp);
        !           323: 
        !           324:     initoidtbl ();
        !           325: 
        !           326:     exit (yyparse ());         /* NOTREACHED */
        !           327: }
        !           328: 
        !           329: /*    ERRORS */
        !           330: 
        !           331: yyerror (s)
        !           332: register char   *s;
        !           333: {
        !           334:     yyerror_aux (s);
        !           335: 
        !           336:     if (*sysout)
        !           337:        (void) unlink (sysout);
        !           338:     if (*sysdef)
        !           339:        (void) unlink (sysdef);
        !           340:     if (*sysact)
        !           341:        (void) unlink (sysact);
        !           342: 
        !           343:     exit (1);
        !           344: }
        !           345: 
        !           346: #ifndef lint
        !           347: warning (va_alist)
        !           348: va_dcl
        !           349: {
        !           350:     char       buffer[BUFSIZ];
        !           351:     char       buffer2[BUFSIZ];
        !           352:     char       *cp;
        !           353:     va_list    ap;
        !           354: 
        !           355:     va_start (ap);
        !           356: 
        !           357:     _asprintf (buffer, NULLCP, ap);
        !           358: 
        !           359:     va_end (ap);
        !           360: 
        !           361:     (void) sprintf (buffer2, "Warning: %s", buffer);
        !           362:     yyerror_aux (buffer2);
        !           363: }
        !           364: 
        !           365: #else
        !           366: 
        !           367: /* VARARGS1 */
        !           368: warning (fmt)
        !           369: char   *fmt;
        !           370: {
        !           371:     warning (fmt);
        !           372: }
        !           373: #endif
        !           374: 
        !           375: static yyerror_aux (s)
        !           376: register char   *s;
        !           377: {
        !           378:     if (linepos)
        !           379:        (void) fprintf (stderr, "\n"), linepos = 0;
        !           380: 
        !           381:     if (eval)
        !           382:        (void) fprintf (stderr, "type %s: ", eval);
        !           383:     else
        !           384:        (void) fprintf (stderr, "line %d: ", yylineno);
        !           385:     (void) fprintf (stderr, "%s\n", s);
        !           386:     if (!eval)
        !           387:        (void) fprintf (stderr, "last token read was \"%s\"\n", yytext);
        !           388: }
        !           389: 
        !           390: /*  */
        !           391: 
        !           392: #ifndef        lint
        !           393: myyerror (va_alist)
        !           394: va_dcl
        !           395: {
        !           396:     char    buffer[BUFSIZ];
        !           397:     va_list ap;
        !           398: 
        !           399:     va_start (ap);
        !           400: 
        !           401:     _asprintf (buffer, NULLCP, ap);
        !           402: 
        !           403:     va_end (ap);
        !           404: 
        !           405:     yyerror (buffer);
        !           406: }
        !           407: #else
        !           408: /* VARARGS */
        !           409: 
        !           410: myyerror (fmt)
        !           411: char   *fmt;
        !           412: {
        !           413:     myyerror (fmt);
        !           414: }
        !           415: #endif
        !           416: 
        !           417: 
        !           418: #ifndef        lint
        !           419: static pyyerror (va_alist)
        !           420: va_dcl
        !           421: {
        !           422:     char    buffer[BUFSIZ];
        !           423:     register YP        yp;
        !           424:     va_list    ap;
        !           425: 
        !           426:     va_start (ap);
        !           427: 
        !           428:     yp = va_arg (ap, YP);
        !           429: 
        !           430:     _asprintf (buffer, NULLCP, ap);
        !           431: 
        !           432:     va_end (ap);
        !           433: 
        !           434:     yyerror_aux (buffer);
        !           435:     print_type (yp, 0);
        !           436: 
        !           437: 
        !           438:     if (*sysout)
        !           439:        (void) unlink (sysout);
        !           440:     if (*sysdef)
        !           441:        (void) unlink (sysdef);
        !           442:     if (*sysact)
        !           443:        (void) unlink (sysact);
        !           444: 
        !           445:     exit (1);
        !           446: }
        !           447: #else
        !           448: /* VARARGS */
        !           449: 
        !           450: static pyyerror (yp, fmt)
        !           451: YP     yp;
        !           452: char   *fmt;
        !           453: {
        !           454:     pyyerror (yp, fmt);
        !           455: }
        !           456: #endif
        !           457: 
        !           458: /*  */
        !           459: 
        !           460: yywrap () {
        !           461:     if (linepos)
        !           462:        (void) fprintf (stderr, "\n"), linepos = 0;
        !           463: 
        !           464:     return 1;
        !           465: }
        !           466: 
        !           467: /*  */
        !           468: 
        !           469: /* ARGSUSED */
        !           470: 
        !           471: yyprint (s, f, top)
        !           472: char    *s;
        !           473: int    f;
        !           474: int    top;
        !           475: {
        !           476:     int     len;
        !           477:     static int  nameoutput = 0;
        !           478:     static int  outputlinelen = 79;
        !           479: 
        !           480:     if (sflag || !s)
        !           481:        return;
        !           482: 
        !           483:     if (!nameoutput) {
        !           484:        if (linepos)
        !           485:            (void) fprintf (stderr, "\n\n");
        !           486: 
        !           487:        (void) fprintf (stderr, "%s", mymodule);
        !           488:        nameoutput = (linepos = strlen (mymodule)) + 1;
        !           489: 
        !           490:        (void) fprintf (stderr, " types:");
        !           491:        linepos += 7;
        !           492: 
        !           493:        if (top)
        !           494:            return;
        !           495:     }
        !           496: 
        !           497:     len = strlen (s);
        !           498:     if (linepos != nameoutput)
        !           499:        if (len + linepos + 1 > outputlinelen)
        !           500:            (void) fprintf (stderr, "\n%*s", linepos = nameoutput, "");
        !           501:        else
        !           502:            (void) fprintf (stderr, " "), linepos++;
        !           503:     (void) fprintf (stderr, "%s", s);
        !           504:     linepos += len;
        !           505: }
        !           506: 
        !           507: /*    PASS1 */
        !           508: 
        !           509: pass1 ()
        !           510: {
        !           511: #if 0
        !           512:     (void) printf ("%s ", mymodule);
        !           513:     if (mymoduleid) {
        !           514:        (void) printf ("%s ", oidprint(mymoduleid));
        !           515:     }
        !           516:     (void) printf ("DEFINITIONS ::=\n\n");
        !           517: #endif
        !           518: }
        !           519: 
        !           520: /*  */
        !           521: 
        !           522: pass1_type (encpref, decpref, prfpref, mod, id, yp)
        !           523: register char  *encpref,
        !           524:               *decpref,
        !           525:               *prfpref,
        !           526:               *mod,
        !           527:               *id;
        !           528: register YP    yp;
        !           529: {
        !           530:     register SY            sy;
        !           531: 
        !           532:     if (lookup_type (mod, id)) /* no duplicate entries, please... */
        !           533:        return;
        !           534: 
        !           535:     if (pepydebug) {
        !           536:        if (linepos)
        !           537:            (void) fprintf (stderr, "\n"), linepos = 0;
        !           538: 
        !           539:        (void) fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
        !           540:        print_type (yp, 0);
        !           541:        (void) fprintf (stderr, "--------\n");
        !           542:     }
        !           543:     else
        !           544:        if (!(yp -> yp_flags & YP_IMPORTED))
        !           545:            yyprint (id, 0, 0);
        !           546: 
        !           547:     sy = new_symbol (encpref, decpref, prfpref, mod, id, yp);
        !           548:     mysymbols = add_symbol (mysymbols, sy);
        !           549: }
        !           550: 
        !           551: /*    PASS2 */
        !           552: 
        !           553: pass2 () {
        !           554:     register SY            sy;
        !           555:     register YP            yp;
        !           556: 
        !           557:     if (!sflag)
        !           558:        (void) fflush (stderr);
        !           559: 
        !           560:     modsym_aux (mymodule, modulename);
        !           561: 
        !           562:     (void) sprintf (sysdef, "%s-types.h", mymodule);
        !           563:     if ((fdef = fopen (sysdef, "w")) == NULL)
        !           564:        myyerror ("unable to write %s", sysdef);
        !           565:     (void) fprintf (fdef, "/* automatically generated by %s, do not edit! */\n\n",
        !           566:            autogen);
        !           567:     (void) fprintf (fdef, "#ifndef\t_module_%s_defined_\n", modulename);
        !           568:     (void) fprintf (fdef, "#define\t_module_%s_defined_\n\n", modulename);
        !           569: 
        !           570:     (void) fprintf (fdef, "#ifndef\tPEPSY_VERSION\n");
        !           571:     (void) fprintf (fdef, "#define\tPEPSY_VERSION\t\t%d\n", PEPSY_VERSION_NUMBER);
        !           572:     (void) fprintf (fdef, "#endif\n\n");
        !           573: 
        !           574:     {
        !           575: #define NFILES         5
        !           576:        char *files[NFILES];
        !           577:            /* { "psap.h", "pepsy.h", "UNIV-types.h", (char *)0 }; */
        !           578: 
        !           579:        int last = 0;   /* last slot available in files */
        !           580: 
        !           581:        files[last++] = "psap.h";
        !           582:        files[last++] = "pepsy.h";
        !           583: 
        !           584:        if (strcmp (mymodule, "UNIV")) {
        !           585:            files[last++] = "pepsy/UNIV-types.h";
        !           586:        }
        !           587: 
        !           588:         files[last++] = (char *)0;
        !           589: 
        !           590:         doincl(fdef, files);
        !           591: 
        !           592: #undef NFILES
        !           593:     }
        !           594: 
        !           595:     (void) fprintf (fdef, "#ifndef\tPEPYPATH\n");
        !           596:     (void) fprintf (fdef, "#include <isode/pepsy/%s%s>\n", mymodule, HFILE1);
        !           597:     (void) fprintf (fdef, "#else\n");
        !           598:     (void) fprintf (fdef, "#include \"%s%s\"\n", mymodule, HFILE1);
        !           599:     (void) fprintf (fdef, "#endif\n");
        !           600: 
        !           601: #if 0
        !           602:     if (fflag) {
        !           603:        (void) sprintf (sysact, "%s-types.tmp", mymodule);
        !           604:        if ((fact = fopen (sysact, "w+")) == NULL)
        !           605:            myyerror ("unable to write %s", sysact);
        !           606:     }
        !           607: #endif
        !           608: 
        !           609:     for (sy = mysymbols; sy; sy = sy -> sy_next) {
        !           610:        eval = sy -> sy_name;
        !           611:        yp = sy -> sy_type;
        !           612:        if (sy -> sy_module == NULLCP)
        !           613:            yyerror ("no module name associated with symbol");
        !           614:        if (yp -> yp_flags & YP_IMPORTED)
        !           615:            continue;
        !           616: 
        !           617:        do_struct0 (yp, eval);
        !           618: #if 0
        !           619:        if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
        !           620:            myyerror ("write error - %s", sys_errname (errno));
        !           621: #endif
        !           622:        if (ferror (stdout) || ferror (fdef))
        !           623:            myyerror ("write error - %s", sys_errname (errno));
        !           624:     }
        !           625:     /* dump out the references to the external types */
        !           626:     proc_extmod(fdef);
        !           627: 
        !           628:     for (sy = mysymbols; sy; sy = sy -> sy_next) {
        !           629:        eval = sy -> sy_name;
        !           630:        yp = sy -> sy_type;
        !           631:        if (yp -> yp_flags & YP_IMPORTED)
        !           632:            continue;
        !           633: 
        !           634:        do_struct1 (yp, eval, NULLCP);
        !           635: #if 0
        !           636:        if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
        !           637:            myyerror ("write error - %s", sys_errname (errno));
        !           638: #endif
        !           639:        if (ferror (stdout) || ferror (fdef))
        !           640:            myyerror ("write error - %s", sys_errname (errno));
        !           641:     }
        !           642: 
        !           643:     for (sy = mysymbols; sy; sy = sy -> sy_next) {
        !           644:        eval = sy -> sy_name;
        !           645:        yp = sy -> sy_type;
        !           646:        if (yp -> yp_flags & YP_IMPORTED)
        !           647:            continue;
        !           648: 
        !           649:        do_struct2 (yp, eval, NULLCP);
        !           650: #if 0
        !           651:        if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
        !           652:            myyerror ("write error - %s", sys_errname (errno));
        !           653: #endif
        !           654:        if (ferror (stdout) || ferror (fdef))
        !           655:            myyerror ("write error - %s", sys_errname (errno));
        !           656:     }
        !           657: 
        !           658:     peri_pass2();
        !           659: 
        !           660: #if 0
        !           661:     if (fflag) {
        !           662:        register int    c;
        !           663: 
        !           664:        (void) fflush (fact);
        !           665:        (void) fseek (fact, 0L, 0);
        !           666: 
        !           667:        (void) printf ("\n%%{\n");
        !           668:        while ((c = getc (fact)) != EOF)
        !           669:                (void) putchar (c);
        !           670:        (void) printf ("\n%%}\n");
        !           671: 
        !           672:        (void) fclose (fact);
        !           673:        if (*sysact)
        !           674:            (void) unlink (sysact);
        !           675:     }
        !           676: #endif
        !           677: 
        !           678:     (void) fprintf (fdef, "#endif\n");
        !           679:     (void) fflush (fdef);
        !           680:     (void) fflush (stdout);
        !           681:     if (ferror (stdout) || ferror (fdef))
        !           682:        myyerror ("write error - %s", sys_errname (errno));
        !           683:     (void) fclose (fdef);
        !           684: 
        !           685:     write_ph_file();
        !           686: }
        !           687: 
        !           688: /*  */
        !           689: 
        !           690: /* ARGSUSED */
        !           691: 
        !           692: static do_struct0 (yp, id)
        !           693: register YP    yp;
        !           694: char   *id;
        !           695: {
        !           696:     register YP            y;
        !           697:     MD md;
        !           698: 
        !           699:     switch (yp -> yp_code) {
        !           700:        case YP_SEQLIST:
        !           701:        case YP_SETLIST:
        !           702:            components_pullup (yp);
        !           703:            break;
        !           704: 
        !           705:        default:
        !           706:            break;
        !           707:     }
        !           708: 
        !           709:     switch (yp -> yp_code) {
        !           710:        case YP_SEQTYPE: 
        !           711:        case YP_SETTYPE: 
        !           712:            do_struct0 (yp -> yp_type, id);
        !           713:            break;
        !           714: 
        !           715:        case YP_CHOICE: 
        !           716:        case YP_SETLIST: 
        !           717:            choice_pullup (yp, yp -> yp_code == YP_CHOICE ? CH_FULLY
        !           718:                                                          : CH_PARTIAL);
        !           719:            /* and fall */
        !           720:        case YP_SEQLIST: 
        !           721:            for (y = yp -> yp_type; y; y = y -> yp_next)
        !           722:                do_struct0 (y, id);
        !           723:            break;
        !           724: 
        !           725:        case YP_IDEFINED: 
        !           726:            if (yp -> yp_module && strcmp (yp -> yp_module, mymodule)) {
        !           727:                if ((md = lookup_module (yp -> yp_module, yp -> yp_modid))
        !           728:                  == NULLMD || (md->md_flags & MDF_SEEN) == 0) {
        !           729:                        addextmod(yp -> yp_module);
        !           730: #if 0
        !           731:                    (void) fprintf(fdef, "#include \"%s-types.h\"\n",
        !           732:                        yp -> yp_module);
        !           733: #endif
        !           734:                    if (md)
        !           735:                        md->md_flags |= MDF_SEEN;
        !           736:                }
        !           737:            }
        !           738:            break;
        !           739: 
        !           740:        default: 
        !           741:            break;
        !           742:     }
        !           743: }
        !           744: 
        !           745: /*  */
        !           746: 
        !           747: static do_struct1 (yp, id, pullup)
        !           748: register YP    yp;
        !           749: char   *id,
        !           750:        *pullup;
        !           751: {
        !           752:     register int    i,
        !           753:                     j;
        !           754:     char    buf1[BUFSIZ];
        !           755:     register YP            y;
        !           756:     register YV            yv;
        !           757: 
        !           758:     switch (yp -> yp_code) {
        !           759:        case YP_BIT: 
        !           760:        case YP_BITLIST: 
        !           761:        case YP_SEQ: 
        !           762:        case YP_SET: 
        !           763:        case YP_ANY: 
        !           764:            (void) fprintf (fdef, "\n");
        !           765:            if (aflag)
        !           766:                printag (yp, 4, pullup);
        !           767:            (void) fprintf (fdef, "#define\t%s\tPElement\n",
        !           768:                    modsym (mymodule, id, "type"));
        !           769:            if (yp -> yp_code == YP_BITLIST) {
        !           770:                i = -1;
        !           771:                for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
        !           772:                    if ((j = val2int (yv)) < 0)
        !           773:                        pyyerror (yp, "invalid bit number in BIT STRING");
        !           774:                    else
        !           775:                        if (j > i)
        !           776:                            i = j;
        !           777:                if (i < sizeof (int) * 8) {     /* NBBY */
        !           778:                    (void) fprintf (fdef, "#define\t%s\t\"\\020",
        !           779:                            modsym (mymodule, eval, "bits"));
        !           780:                    for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
        !           781:                        if (yv -> yv_flags & YV_NAMED)
        !           782:                            (void) fprintf (fdef, "\\0%o%s",
        !           783:                                    val2int (yv) + 1, yv -> yv_named);
        !           784:                        else
        !           785:                            (void) fprintf (fdef, "\\0%oBIT%d",
        !           786:                                    val2int (yv) + 1, val2int (yv));
        !           787:                    (void) fprintf (fdef, "\"\n");
        !           788:                }
        !           789:                for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !           790:                    modsym_aux (yv -> yv_named, buf1);
        !           791:                    (void) fprintf (fdef, "#define\t%s_%s\t%d\n",
        !           792:                            modsym (mymodule, eval, "bit"),
        !           793:                            buf1, val2int (yv));
        !           794:                }
        !           795:            }
        !           796:            if (fflag)
        !           797:                (void) fprintf (fdef, "#define\t%s\tpe_free\n",
        !           798:                        modsym (mymodule, id, "free"));
        !           799:            break;
        !           800: 
        !           801:        case YP_OCT: 
        !           802:            (void) fprintf (fdef, "\n");
        !           803:            if (aflag)
        !           804:                printag (yp, 4, pullup);
        !           805:            (void) fprintf (fdef, "#define\t%s\tqbuf\n",
        !           806:                    modsym (mymodule, id, "type"));
        !           807:            if (fflag)
        !           808:                (void) fprintf (fdef, "#define\t%s\tqb_free\n",
        !           809:                        modsym (mymodule, id, "free"));
        !           810:            break;
        !           811: 
        !           812:        case YP_OID: 
        !           813:            (void) fprintf (fdef, "\n");
        !           814:            if (aflag)
        !           815:                printag (yp, 4, pullup);
        !           816:            (void) fprintf (fdef, "#define\t%s\tOIDentifier\n",
        !           817:                    modsym (mymodule, id, "type"));
        !           818:            if (fflag)
        !           819:                (void) fprintf (fdef, "#define\t%s\toid_free\n",
        !           820:                        modsym (mymodule, id, "free"));
        !           821:            break;
        !           822: 
        !           823:        case YP_IDEFINED: 
        !           824:            (void) fprintf (fdef, "\n");
        !           825:            if (aflag)
        !           826:                printag (yp, 4, pullup);
        !           827:            (void) fprintf (fdef, "#define\t%s\t",
        !           828:                    modsym (mymodule, id, "type"));
        !           829:            (void) fprintf (fdef, "%s\n",
        !           830:                    modsym (yp -> yp_module, yp -> yp_identifier, "type"));
        !           831:            if (fflag) {
        !           832:                (void) fprintf (fdef, "#define\t%s\t",
        !           833:                        modsym (mymodule, id, "free"));
        !           834:                (void) fprintf (fdef, "%s\n",
        !           835:                        modsym (yp -> yp_module, yp -> yp_identifier, "free"));
        !           836:            }
        !           837:            break;
        !           838: 
        !           839:        case YP_SEQLIST: 
        !           840:        case YP_SETLIST: 
        !           841:        case YP_CHOICE: 
        !           842:            if (hflag && (y = yp -> yp_type) && !y -> yp_next) {
        !           843:                do_struct1 (y, id, tags[yp -> yp_code]);
        !           844:                break;
        !           845:            }
        !           846:        /* else fall */
        !           847: 
        !           848:        default: 
        !           849:            break;
        !           850:     }
        !           851: }
        !           852: 
        !           853: /*  */
        !           854: 
        !           855: static do_struct2 (yp, id, pullup)
        !           856: register YP    yp;
        !           857: char   *id,
        !           858:        *pullup;
        !           859: {
        !           860:     register YP            y;
        !           861:     int        flg = (yp -> yp_code == YP_SEQTYPE || yp -> yp_code == YP_SETTYPE);
        !           862: 
        !           863:     switch (yp -> yp_code) {
        !           864:        case YP_BIT: 
        !           865:        case YP_BITLIST: 
        !           866:        case YP_SEQ: 
        !           867:        case YP_SET: 
        !           868:        case YP_ANY: 
        !           869:        case YP_OCT: 
        !           870:        case YP_OID: 
        !           871:        case YP_IDEFINED: 
        !           872:            break;
        !           873: 
        !           874:        case YP_SEQLIST: 
        !           875:        case YP_SETLIST: 
        !           876:        case YP_CHOICE: 
        !           877:            if (hflag && (y = yp -> yp_type) && !y -> yp_next) {
        !           878:                do_struct2 (y, id, tags[yp -> yp_code]);
        !           879:                break;
        !           880:            }
        !           881:            /* else fall */
        !           882: 
        !           883:        default: 
        !           884:            (void) fprintf (fdef, "\n");
        !           885:            if (aflag)
        !           886:                printag (yp, 4, pullup);
        !           887:            (void) fprintf (fdef, "struct %s {\n", modsym (mymodule, id, "type"));
        !           888: #if 0
        !           889:            if (fflag) {        
        !           890:                (void) fprintf (fact, "\n%s (arg)\n", modsym (mymodule, id, "free"));
        !           891:                (void) fprintf (fact, "struct %s *arg;\n{\n",
        !           892:                        modsym (mymodule, id, "type"));
        !           893:                (void) fprintf (fact, "    struct %s *parm = arg;\n",
        !           894:                        modsym (mymodule, id, "type"));
        !           895:                if (h2flag && flg)
        !           896:                    (void) fprintf (fact, "    int\tn_parm;\n");
        !           897:                (void) fprintf (fact, "\n    if (parm == NULL)\n\treturn;\n\n");
        !           898:            }
        !           899: #endif
        !           900:            pepsy (yp, 1, 1, "parm", id, "parm", flg && h2flag);
        !           901:            (void) fprintf (fdef, "};\n");
        !           902:            (void) fprintf (fdef, "#define\t%s(parm)\\\n\t%s\n", modsym (mymodule, id, "free"), gfree(mymodule, id, "parm"));
        !           903: #if 0
        !           904:            if (fflag) {
        !           905:                if (yp -> yp_code != YP_SEQTYPE &&
        !           906:                    yp -> yp_code != YP_SETTYPE)
        !           907:                    (void) fprintf (fact, "\n    free ((char *) arg);");
        !           908:                (void) fprintf (fact, "\n}\n");
        !           909:            }
        !           910: #endif
        !           911:                
        !           912:            break;
        !           913:     }
        !           914: }
        !           915: 
        !           916: /*  */
        !           917: 
        !           918: #if 0
        !           919: static int type0_brackets;
        !           920: 
        !           921: static do_type0 (yp, direction)
        !           922: register YP    yp;
        !           923: int    direction;
        !           924: {
        !           925:     type0_brackets = type0_bit = 0;
        !           926:     do_type0_aux (yp, direction);
        !           927:     if (type0_brackets)
        !           928:        (void) printf ("    %%}\n   ");
        !           929: }
        !           930: 
        !           931: static do_type0_aux (yp, direction)
        !           932: register YP yp;
        !           933: int    direction;
        !           934: {
        !           935:     register YP            y;
        !           936: 
        !           937:     if (yp -> yp_declexp) {
        !           938:        if (type0_brackets++ == 0)
        !           939:            (void) printf ("\n    %%{\n");
        !           940:        (void) printf ("\tstruct %s *%s%s;\n", yp -> yp_declexp,
        !           941:                direction == YP_DECODER ? "*" : "", yp -> yp_declexp);
        !           942:     }
        !           943: 
        !           944:     switch (yp -> yp_code) {
        !           945:        case YP_SEQTYPE: 
        !           946:        case YP_SETTYPE: 
        !           947:            if (h2flag) {
        !           948:                if (type0_brackets++ == 0)
        !           949:                    (void) printf ("\n    %%{\n");
        !           950:                (void) printf ("\tint     n_%s = 0;\n", yp -> yp_declexp ?
        !           951:                        yp -> yp_declexp : "parm");
        !           952:            }
        !           953:            do_type0_aux (yp -> yp_type, direction);
        !           954:            break;
        !           955: 
        !           956:        case YP_SEQLIST: 
        !           957:        case YP_SETLIST: 
        !           958:        case YP_CHOICE: 
        !           959:            for (y = yp -> yp_type; y; y = y -> yp_next)
        !           960:                do_type0_aux (y, direction);
        !           961:            break;
        !           962: 
        !           963:        case YP_BIT:
        !           964:        case YP_BITLIST:
        !           965:            if (direction == YP_ENCODER) {
        !           966:                if (type0_brackets++ == 0)
        !           967:                    (void) printf ("\n    %%{\n");
        !           968:                if (type0_bit++ == 0)
        !           969:                    (void) printf ("\tchar *bit_parm;\n");
        !           970:            }
        !           971:            break;
        !           972: 
        !           973:        default: 
        !           974:            break;
        !           975:     }
        !           976: }
        !           977: #endif
        !           978: 
        !           979: /*  */
        !           980: 
        !           981: /* ARGSUSED */
        !           982: 
        !           983: static do_type1 (yp, top, level, id, var, action2, direction)
        !           984: register YP yp;
        !           985: int    top,
        !           986:        level;
        !           987: char   *id,
        !           988:        *var,
        !           989:        *action2;
        !           990: int    direction;
        !           991: {
        !           992:     int            i;
        !           993:     char   *cp,
        !           994:           *ep,
        !           995:            buffer[BUFSIZ],
        !           996:            varbuf[BUFSIZ];
        !           997:     register YP            y;
        !           998:     register YV            yv;
        !           999:     register YT            yt;
        !          1000: 
        !          1001:     (void) printf ("%*s", level * 4, "");
        !          1002: 
        !          1003:     if (yp -> yp_flags & YP_ID) {
        !          1004:        (void) printf ("%s", yp -> yp_id);
        !          1005:        if (!(yp -> yp_flags & YP_TAG))
        !          1006:            (void) printf ("\n%*s", ++level * 4, "");
        !          1007:     }
        !          1008: 
        !          1009:     if (yp -> yp_flags & YP_TAG) {
        !          1010:        yt = yp -> yp_tag;
        !          1011:        (void) printf ("[%s%d]\n", classes[yt -> yt_class], val2int (yt -> yt_value));
        !          1012:        level++;
        !          1013:        (void) printf ("%*s", level * 4, "");
        !          1014:     }
        !          1015:     if (yp -> yp_flags & YP_OPTIONAL && yp -> yp_varexp) {
        !          1016:        if ((ep = index (yp -> yp_varexp, ' ')) == NULL)
        !          1017:            yyerror ("Bug in varexp!");
        !          1018: 
        !          1019:        (void) sprintf (varbuf, "%*.*s", ep - yp -> yp_varexp,
        !          1020:                        ep - yp -> yp_varexp, yp -> yp_varexp);
        !          1021:     }
        !          1022: 
        !          1023:     switch (yp -> yp_code) {
        !          1024:        case YP_BOOL: 
        !          1025:            if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
        !          1026:                direction == YP_DECODER) {
        !          1027:                if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
        !          1028:                    (void) printf ("dummy-for-default\n%*s", ++level * 4, "");
        !          1029:                if (yp -> yp_flags & YP_OPTIONAL)
        !          1030:                    (void) printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
        !          1031:                            varbuf, yp -> yp_optcontrol, level * 4, "");
        !          1032:                else
        !          1033:                    (void) printf ("%%{ %s%s = %d; %%}\n%*s",
        !          1034:                            var, SVAL (yp -> yp_varexp),
        !          1035:                            val2int (yp -> yp_default) ? 1 : 0, level * 4, "");
        !          1036:            }
        !          1037:            break;
        !          1038: 
        !          1039:        case YP_INT: 
        !          1040:            if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
        !          1041:                direction == YP_DECODER) {
        !          1042:                if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
        !          1043:                    (void) printf ("dummy-for-default\n%*s", ++level * 4, "");
        !          1044:                if (yp -> yp_flags & YP_OPTIONAL)
        !          1045:                    (void) printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
        !          1046:                            varbuf, yp -> yp_optcontrol, level * 4, "");
        !          1047:                else
        !          1048:                    (void) printf ("%%{ %s%s = %d; %%}\n%*s",
        !          1049:                            var, SVAL (yp -> yp_varexp),
        !          1050:                            val2int (yp -> yp_default), level * 4, "");
        !          1051:            }
        !          1052:            break;
        !          1053: 
        !          1054:        case YP_INTLIST:
        !          1055:        case YP_ENUMLIST:
        !          1056:            if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
        !          1057:                direction == YP_DECODER) {
        !          1058:                if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
        !          1059:                    (void) printf ("dummy-for-default\n%*s", ++level * 4, "");
        !          1060:                if (yp -> yp_flags & YP_OPTIONAL)
        !          1061:                    (void) printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
        !          1062:                            varbuf, yp -> yp_optcontrol, level * 4, "");
        !          1063:                else
        !          1064:                    (void) printf ("%%{ %s%s = %d; %%}\n%*s",
        !          1065:                            var, SVAL (yp -> yp_varexp), dfl2int (yp),
        !          1066:                            level * 4, "");
        !          1067:            }
        !          1068:            break;
        !          1069: 
        !          1070:        case YP_REAL: 
        !          1071:            if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
        !          1072:                direction == YP_DECODER) {
        !          1073:                if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
        !          1074:                    (void) printf ("dummy-for-default\n%*s", ++level * 4, "");
        !          1075:                if (yp -> yp_flags & YP_OPTIONAL)
        !          1076:                    (void) printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
        !          1077:                            varbuf, yp -> yp_optcontrol, level * 4, "");
        !          1078:                else
        !          1079:                    (void) printf ("%%{ %s%s = %g; %%}\n%*s",
        !          1080:                            var, SVAL (yp -> yp_varexp),
        !          1081:                            val2real (yp -> yp_default), level * 4, "");
        !          1082:            }
        !          1083:            break;
        !          1084: 
        !          1085:        case YP_NULL:
        !          1086:            if ((yp -> yp_flags & YP_OPTIONAL) && direction == YP_DECODER) {
        !          1087:                if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
        !          1088:                    (void) printf ("dummy-for-default\n%*s", ++level * 4, "");
        !          1089:                (void) printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
        !          1090:                        varbuf, yp -> yp_optcontrol, level * 4, "");
        !          1091:            }
        !          1092:            break;
        !          1093:     }
        !          1094: 
        !          1095:     if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == (YP_TAG | YP_IMPLICIT))
        !          1096:        (void) printf ("IMPLICIT ");
        !          1097:     if (yp -> yp_flags & YP_BOUND)
        !          1098:        (void) printf ("%s < ", yp -> yp_bound);
        !          1099:     if (yp -> yp_flags & YP_COMPONENTS)
        !          1100:        (void) printf ("COMPONENTS OF ");
        !          1101:     if (yp -> yp_flags & YP_ENCRYPTED)
        !          1102:        (void) printf ("ENCRYPTED ");
        !          1103: 
        !          1104:     switch (yp -> yp_code) {
        !          1105:        case YP_BOOL: 
        !          1106:            (void) printf ("BOOLEAN");
        !          1107:            switch (direction) {
        !          1108:                case YP_ENCODER: 
        !          1109:                case YP_DECODER: 
        !          1110:                    (void) printf (top ? "\n%*s[[b %s -> %s ]]" : "\n%*s[[b %s%s ]]",
        !          1111:                            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1112:                    break;
        !          1113:            }
        !          1114:            break;
        !          1115: 
        !          1116:        case YP_INT: 
        !          1117:            (void) printf ("INTEGER");
        !          1118:            switch (direction) {
        !          1119:                case YP_ENCODER: 
        !          1120:                case YP_DECODER: 
        !          1121:                    (void) printf (top ? "\n%*s[[i %s -> %s ]]" : "\n%*s[[i %s%s ]]",
        !          1122:                            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1123:                    break;
        !          1124:            }
        !          1125:            break;
        !          1126: 
        !          1127:        case YP_INTLIST:
        !          1128:        case YP_ENUMLIST:
        !          1129:            if (yp -> yp_code == YP_ENUMLIST)
        !          1130:                (void) printf ("ENUMERATED");
        !          1131:            else
        !          1132:                (void) printf ("INTEGER");
        !          1133:            switch (direction) {
        !          1134:                case YP_ENCODER: 
        !          1135:                case YP_DECODER: 
        !          1136:                    (void) printf (top ? "\n%*s[[i %s -> %s ]]\n%*s{\n"
        !          1137:                            : "\n%*s[[i %s%s ]]\n%*s{\n",
        !          1138:                            level * 4, "", var, SVAL (yp -> yp_varexp),
        !          1139:                            level * 4, "");
        !          1140:                    break;
        !          1141: 
        !          1142:                default: 
        !          1143:                    (void) printf (" {\n");
        !          1144:                    break;
        !          1145:            }
        !          1146:            level++;
        !          1147:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
        !          1148:                (void) printf ("%*s%s(%d)%s\n", level * 4, "", yv -> yv_named,
        !          1149:                        val2int (yv), yv -> yv_next ? "," : "");
        !          1150:            level--;
        !          1151:            (void) printf ("%*s}", level * 4, "");
        !          1152:            break;
        !          1153: 
        !          1154:        case YP_BIT: 
        !          1155:            (void) printf ("BIT STRING");
        !          1156:            switch (direction) {
        !          1157:                case YP_ENCODER: 
        !          1158:                    (void) printf ("\n%*s[[x bit_parm = bitstr2strb (%s%s, &len) $ len]]",
        !          1159:                            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1160:                    (void) printf ("\n%*s%%{\n%*sfree (bit_parm);\n", level * 4, "",
        !          1161:                            (level + 1) * 4, "");
        !          1162:                    if (action2)
        !          1163:                        (void) printf ("%*s%s\n", (level + 1) * 4, "", action2);
        !          1164:                    (void) printf ("%*s%%}\n", level * 4, "");
        !          1165:                    break;
        !          1166: 
        !          1167:                case YP_DECODER: 
        !          1168:                    balloc (yp, var, action2, level);
        !          1169:                    break;
        !          1170:            }
        !          1171:            break;
        !          1172: 
        !          1173:        case YP_BITLIST: 
        !          1174:            (void) printf ("BIT STRING");
        !          1175:            switch (direction) {
        !          1176:                case YP_ENCODER: 
        !          1177:                    (void) printf ("\n%*s[[x bit_parm = bitstr2strb (%s%s, &len) $ len]]\n%*s{\n",
        !          1178:                            level * 4, "", var, SVAL (yp -> yp_varexp),
        !          1179:                            level * 4, "");
        !          1180:                    break;
        !          1181: 
        !          1182:                case YP_DECODER: 
        !          1183:                default: 
        !          1184:                    (void) printf (" {\n");
        !          1185:                    break;
        !          1186:            }
        !          1187:            level++;
        !          1188:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
        !          1189:                (void) printf ("%*s%s(%d)%s\n", level * 4, "", yv -> yv_named,
        !          1190:                        val2int (yv), yv -> yv_next ? "," : "");
        !          1191:            level--;
        !          1192:            (void) printf ("%*s}", level * 4, "");
        !          1193:            switch (direction) {
        !          1194:                case YP_DECODER: 
        !          1195:                    balloc (yp, var, action2, level);
        !          1196:                    break;
        !          1197: 
        !          1198:                case YP_ENCODER:
        !          1199:                    (void) printf ("\n%*s%%{\n%*sfree (bit_parm);\n", level * 4, "",
        !          1200:                            (level + 1) * 4, "");
        !          1201:                    if (action2)
        !          1202:                        (void) printf ("%*s%s\n", (level + 1) * 4, "", action2);
        !          1203:                    (void) printf ("%*s%%}\n", level * 4, "");
        !          1204:                    break;
        !          1205:            }
        !          1206:            break;
        !          1207: 
        !          1208:        case YP_OCT: 
        !          1209:            (void) printf ("OCTET STRING");
        !          1210:            switch (direction) {
        !          1211:                case YP_ENCODER: 
        !          1212:                    (void) printf ("\n%*s[[q %s%s ]]", level * 4, "",
        !          1213:                            var, SVAL (yp -> yp_varexp));
        !          1214:                    break;
        !          1215: 
        !          1216:                case YP_DECODER: 
        !          1217:                    (void) printf ("\n%*s[[q %s%s ]]", level * 4, "",
        !          1218:                            var, SVAL (yp -> yp_varexp));
        !          1219:                    break;
        !          1220:            }
        !          1221:            break;
        !          1222: 
        !          1223:        case YP_REAL:
        !          1224:            (void) printf ("REAL");
        !          1225:            (void) printf (top ? "\n%*s[[r %s -> %s ]]" : "\n%*s[[r %s%s ]]",
        !          1226:                    level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1227:            break;
        !          1228: 
        !          1229:        case YP_NULL: 
        !          1230:            (void) printf ("NULL");
        !          1231:            break;
        !          1232: 
        !          1233:        case YP_SEQ: 
        !          1234:        case YP_SET:
        !          1235:        case YP_ANY:
        !          1236:            (void) printf ("%s", tags[yp -> yp_code]);
        !          1237:            switch (direction) {
        !          1238:                case YP_ENCODER:
        !          1239:                case YP_DECODER:
        !          1240:                        (void) printf ("\n%*s[[a %s%s ]]",
        !          1241:                                level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1242:                    break;
        !          1243:            }
        !          1244:            break;
        !          1245: 
        !          1246:        case YP_SEQTYPE: 
        !          1247:        case YP_SETTYPE: 
        !          1248:            ep = yp -> yp_code != YP_SETTYPE ? "element" : "member";
        !          1249:            (void) printf ("%s\n", tags [yp -> yp_code]);
        !          1250:            switch (direction) {
        !          1251:                case YP_ENCODER: 
        !          1252:                    if ((y = yp -> yp_type) -> yp_declexp) {
        !          1253:                        (void) printf ("%*s%%{ %s = %s; %%}\n",
        !          1254:                                (level + 1) * 4, "", y -> yp_declexp,
        !          1255:                                SVAL (y -> yp_varexp));
        !          1256:                    }
        !          1257:                    if (h2flag) {
        !          1258:                        if (top) {
        !          1259:                            (void) printf ("%*s<<n_parm = 0; ", (level + 1) * 4, "");
        !          1260:                            (void) printf ("n_parm < parm -> nelem; n_parm++>>\n");
        !          1261:                        }
        !          1262:                        else {
        !          1263:                            (void) printf ("%*s<<n_%s = 0;\n%*sn_%s < %s -> nelem;\n",
        !          1264:                                    (level + 1) * 4, "", yp -> yp_declexp,
        !          1265:                                    (level + 3) * 4, "", yp -> yp_declexp,
        !          1266:                                    yp -> yp_declexp);
        !          1267:                            (void) printf ("%*sn_%s++>>\n",
        !          1268:                                    (level + 3) * 4, "", yp -> yp_declexp);
        !          1269:                        }
        !          1270:                    }
        !          1271:                    else {
        !          1272:                        if (top)
        !          1273:                            (void) printf ("%*s<<; parm; parm = parm -> next>>\n",
        !          1274:                                    (level + 1) * 4, "");
        !          1275:                        else
        !          1276:                            (void) printf ("%*s<<%s = %s%s;\n%*s%s;\n%*s%s = %s -> next>>\n",
        !          1277:                                    (level + 1) * 4, "", yp -> yp_declexp,
        !          1278:                                    var, SVAL (yp -> yp_varexp),
        !          1279:                                    (level + 3) * 4, "", yp -> yp_declexp,
        !          1280:                                    (level + 3) * 4, "", yp -> yp_declexp,
        !          1281:                                    yp -> yp_declexp);
        !          1282:                    }
        !          1283:                    break;
        !          1284: 
        !          1285:                case YP_DECODER: 
        !          1286:                    if (h2flag) {
        !          1287:                        y = yp -> yp_type;
        !          1288:                        xalloc (y, 0, level + 2, y -> yp_declexp,
        !          1289:                                y -> yp_declexp, 1);
        !          1290:                    }
        !          1291:                    else
        !          1292:                        xalloc (yp, 0, level + 1,
        !          1293:                                top ? "parm" : yp -> yp_declexp,
        !          1294:                                top ? modsym (mymodule, eval, "type")
        !          1295:                                : yp -> yp_declexp, 1);
        !          1296:                    break;
        !          1297:            }
        !          1298:            do_type1 (yp -> yp_type, 0, level + 1, ep, "", NULLCP, direction);
        !          1299:            switch (direction) {
        !          1300:                case YP_DECODER:
        !          1301:                    (void) printf ("\n%*s%%{ ", (level + 1) * 4, "");
        !          1302:                    if (h2flag)
        !          1303:                        (void) printf ("n_%s++;", top ? "parm" : yp -> yp_declexp);
        !          1304:                    else
        !          1305:                        if (top)
        !          1306:                            (void) printf ("parm = &((*parm) -> next);");
        !          1307:                        else
        !          1308:                            (void) printf ("%s = &((*%s) -> next);",
        !          1309:                                    yp -> yp_declexp, yp -> yp_declexp);
        !          1310:                    if (action2)
        !          1311:                        (void) printf (" %s", action2);
        !          1312:                    (void) printf (" %%}");
        !          1313:                    break;
        !          1314:            }
        !          1315:            break;
        !          1316: 
        !          1317:        case YP_SEQLIST: 
        !          1318:        case YP_SETLIST: 
        !          1319:            ep = yp -> yp_code != YP_SETLIST ? "element" : "member";
        !          1320:            (void) printf ("%s", tags [yp -> yp_code]);
        !          1321:            (void) printf ("\n%*s%%{\n", (level + 1) * 4, "");
        !          1322:            if (direction == YP_DECODER)
        !          1323:                xalloc (yp, 1, level + 2, yp -> yp_declexp,
        !          1324:                        yp -> yp_declexp, 0);
        !          1325:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1326:                if (y -> yp_declexp)
        !          1327:                    switch (direction) {
        !          1328:                    case YP_ENCODER: 
        !          1329:                        (void) printf ("%*s%s = %s;\n",
        !          1330:                                (level + 2) * 4, "",
        !          1331:                                y -> yp_declexp, y -> yp_varexp);
        !          1332:                        break;
        !          1333: 
        !          1334:                    case YP_DECODER:
        !          1335:                        (void) printf ("%*s%s = &(%s);\n",
        !          1336:                                (level + 2) * 4, "",
        !          1337:                                y -> yp_declexp, y -> yp_varexp);
        !          1338:                        break;
        !          1339:                    }
        !          1340:                if (direction == YP_DECODER &&
        !          1341:                         y -> yp_flags & YP_DEFAULT) {
        !          1342:                    prime_default (y, level + 2);
        !          1343:                }
        !          1344:            }
        !          1345:            (void) printf ("%*s%%}\n%*s{\n", (level + 1) * 4, "",
        !          1346:                    level * 4, "");
        !          1347:            
        !          1348:            if (!hflag || !(y = yp -> yp_type) || y -> yp_next) {
        !          1349:                var = "";
        !          1350:                top = 0;
        !          1351:            }
        !          1352:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1353:                do_type1 (y, top,
        !          1354:                        level + ((y -> yp_flags & (YP_ID | YP_TAG)) ? 1 : 2),
        !          1355:                        ep, var, NULLCP, direction);
        !          1356:                (void) printf ("%s\n", y -> yp_next ? ",\n" : "");
        !          1357:            }
        !          1358:            (void) printf ("%*s}", level * 4, "");
        !          1359:            break;
        !          1360: 
        !          1361:        case YP_CHOICE: 
        !          1362:            (void) printf ("CHOICE");
        !          1363:            if (!hflag || !(y = yp -> yp_type) || y -> yp_next)
        !          1364:                var = "";
        !          1365:            i = 0;
        !          1366:            for (y = yp -> yp_type; y; y = y -> yp_next)
        !          1367:                if (y -> yp_declexp)
        !          1368:                    i++;
        !          1369:            switch (direction) {
        !          1370:                case YP_ENCODER: 
        !          1371:                    if (i) {
        !          1372:                        (void) printf ("\n%*s%%{\n", (level + 1) * 4, "");
        !          1373:                        for (y = yp -> yp_type; y; y = y -> yp_next)
        !          1374:                            if (y -> yp_declexp)
        !          1375:                                (void) printf ("%*s%s = %s;\n", (level + 2) * 4, "",
        !          1376:                                        y -> yp_declexp, y -> yp_varexp);
        !          1377:                        (void) printf ("%*s%%}\n%*s", (level + 1) * 4, "",
        !          1378:                                (level + 1) * 4 - 1, "" );
        !          1379:                    }
        !          1380:                    if (*var)
        !          1381:                        (void) printf (" <<1>>");
        !          1382:                    else
        !          1383:                        if (top)
        !          1384:                            (void) printf (" <<parm -> offset>>");
        !          1385:                        else
        !          1386:                            (void) printf (" <<%s -> offset>>",
        !          1387:                                    yp -> yp_declexp);
        !          1388:                    (void) printf (i ? "\n%*s{\n" : " {\n", level * 4, "");
        !          1389:                    break;
        !          1390: 
        !          1391:                case YP_DECODER: 
        !          1392:                    (void) printf ("\n");
        !          1393:                    xalloc (yp, 0, level + 1, yp -> yp_declexp,
        !          1394:                            yp -> yp_declexp, 1);
        !          1395:                    (void) printf ("%*s{\n", level * 4, "");
        !          1396:                    break;
        !          1397: 
        !          1398:                default: 
        !          1399:                    (void) printf (" {\n");
        !          1400:                    break;
        !          1401:            }
        !          1402:            if (direction == YP_DECODER) {
        !          1403:                (void) sprintf (cp = buffer, "(*(%s)) -> offset = ",
        !          1404:                            top ? "parm" : yp -> yp_declexp);
        !          1405:                cp += strlen (cp);
        !          1406:            }
        !          1407:            else
        !          1408:                cp = NULL;
        !          1409:            if (!hflag || !(y = yp -> yp_type) || y -> yp_next)
        !          1410:                top = 0;
        !          1411:            else
        !          1412:                if (top)
        !          1413:                    cp = NULL;
        !          1414:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1415:                if (cp)
        !          1416:                    (void) sprintf (cp, "%s;", y -> yp_offset);
        !          1417:                do_type1 (y, top, level + 1, "choice", var,
        !          1418:                        cp ? buffer : NULLCP, direction);
        !          1419:                (void) printf ("%s\n", y -> yp_next ? ",\n" : "");
        !          1420:            }
        !          1421:            (void) printf ("%*s}", level * 4, "");
        !          1422:            break;
        !          1423:        
        !          1424:        case YP_OID: 
        !          1425:            (void) printf ("OBJECT IDENTIFIER");
        !          1426:            switch (direction) {
        !          1427:                case YP_ENCODER: 
        !          1428:                case YP_DECODER: 
        !          1429:                    (void) printf ("\n%*s[[O %s%s ]]",
        !          1430:                            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1431:                    break;
        !          1432:            }
        !          1433:            break;
        !          1434: 
        !          1435:        case YP_IDEFINED: 
        !          1436:            if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
        !          1437:                (void) printf ("%s.", yp -> yp_module);
        !          1438:            (void) printf ("%s", yp -> yp_identifier);
        !          1439:            switch (direction) {
        !          1440:                case YP_ENCODER: 
        !          1441:                    (void) printf ("\n%*s[[p %s%s ]]",
        !          1442:                            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1443:                    break;
        !          1444: 
        !          1445:                case YP_DECODER: 
        !          1446:                    (void) printf ("\n%*s[[p &(%s%s)]]",
        !          1447:                            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          1448:                    break;
        !          1449:            }
        !          1450:            break;
        !          1451: 
        !          1452:        default: 
        !          1453:            myyerror ("unknown type: %d", yp -> yp_code);
        !          1454:     }
        !          1455: 
        !          1456:     if (action2)
        !          1457:        switch (yp -> yp_code) {
        !          1458:            case YP_BIT:
        !          1459:            case YP_BITLIST:
        !          1460:                if (direction == YP_ENCODER)
        !          1461:                    break;
        !          1462:            case YP_SEQTYPE:
        !          1463:            case YP_SETTYPE:
        !          1464:                if (direction == YP_DECODER)
        !          1465:                    break;
        !          1466:                /* else fall */
        !          1467: 
        !          1468:            default:            
        !          1469:                (void) printf ("\n%*s%%{ %s %%}", level * 4, "", action2);
        !          1470:                break;
        !          1471:        }
        !          1472: 
        !          1473:     if (yp -> yp_flags & YP_OPTIONAL) {
        !          1474:        (void) printf ("\n%*sOPTIONAL", level * 4, "");
        !          1475: 
        !          1476:        if (direction == YP_ENCODER)
        !          1477:            switch (yp -> yp_code) {
        !          1478:                case YP_BOOL: 
        !          1479:                case YP_INT: 
        !          1480:                case YP_INTLIST:
        !          1481:                case YP_ENUMLIST:
        !          1482:                case YP_NULL:
        !          1483:                case YP_REAL:
        !          1484:                    (void) printf (" <<%s -> optionals & %s >>",
        !          1485:                            varbuf, yp -> yp_optcontrol);
        !          1486:                default: 
        !          1487:                    break;
        !          1488: 
        !          1489:                case YP_BIT: 
        !          1490:                case YP_BITLIST: 
        !          1491:                case YP_OCT: 
        !          1492:                case YP_SEQ: 
        !          1493:                case YP_SEQTYPE: 
        !          1494:                case YP_SEQLIST: 
        !          1495:                case YP_SET: 
        !          1496:                case YP_SETTYPE: 
        !          1497:                case YP_SETLIST: 
        !          1498:                case YP_CHOICE: 
        !          1499:                case YP_ANY: 
        !          1500:                case YP_OID: 
        !          1501:                case YP_IDEFINED: 
        !          1502:                    (void) printf (" <<%s%s>>", var, SVAL (yp -> yp_varexp));
        !          1503:                    break;
        !          1504:            }
        !          1505:     }
        !          1506:     else
        !          1507:        if (yp -> yp_flags & YP_DEFAULT) {
        !          1508:            (void) printf ("\n%*sDEFAULT ", level * 4, "");
        !          1509:            val2prf (yp -> yp_default, level + 2);
        !          1510: 
        !          1511:            if (direction == YP_ENCODER)
        !          1512:                switch (yp -> yp_code) {
        !          1513:                    case YP_BOOL: 
        !          1514:                        (void) printf (" <<%s%s%s>>",
        !          1515:                                val2int (yp -> yp_default) ? "!" : "",
        !          1516:                                var, SVAL (yp -> yp_varexp));
        !          1517:                        break;
        !          1518: 
        !          1519:                    case YP_INT: 
        !          1520:                    case YP_INTLIST:
        !          1521:                    case YP_ENUMLIST:
        !          1522:                        (void) printf (" <<%s%s != %d>>", var, SVAL (yp -> yp_varexp),
        !          1523:                                dfl2int (yp));
        !          1524:                        break;
        !          1525: 
        !          1526:                    case YP_REAL:
        !          1527:                        (void) printf (" << %s%s != %g >>",
        !          1528:                                var, SVAL (yp -> yp_varexp),
        !          1529:                                val2real (yp -> yp_default));
        !          1530:                        break;
        !          1531: 
        !          1532:                    case YP_NULL: 
        !          1533:                    default: 
        !          1534:                        break;
        !          1535: 
        !          1536:                    case YP_BIT: 
        !          1537:                    case YP_BITLIST: 
        !          1538:                    case YP_OCT: 
        !          1539:                    case YP_SEQ: 
        !          1540:                    case YP_SEQTYPE: 
        !          1541:                    case YP_SEQLIST: 
        !          1542:                    case YP_SET: 
        !          1543:                    case YP_SETTYPE: 
        !          1544:                    case YP_SETLIST: 
        !          1545:                    case YP_CHOICE: 
        !          1546:                    case YP_ANY: 
        !          1547:                    case YP_OID: 
        !          1548:                    case YP_IDEFINED: 
        !          1549:                        (void) printf (" <<%s%s>>", var, SVAL (yp -> yp_varexp));
        !          1550:                        break;
        !          1551:                }
        !          1552:        }
        !          1553: 
        !          1554:     if (direction == YP_ENCODER
        !          1555:            && yp -> yp_varexp
        !          1556:            && (cp = index (yp -> yp_varexp, ' '))
        !          1557:            && strncmp (cp + 1, "-> ", 3) == 0) {
        !          1558:        *cp = NULL;
        !          1559:        (void) sprintf (buffer, "(*%s) -> %s", yp -> yp_varexp, cp + 4);
        !          1560:        yp -> yp_varexp = new_string (buffer);
        !          1561:     }
        !          1562: }
        !          1563: 
        !          1564: /*    TYPE HANDLING */
        !          1565: 
        !          1566: static YP  lookup_type (mod, id)
        !          1567: register char *mod,
        !          1568:              *id;
        !          1569: {
        !          1570:     register SY            sy;
        !          1571: 
        !          1572:     for (sy = mysymbols; sy; sy = sy -> sy_next) {
        !          1573:        if (mod) {
        !          1574:            if (strcmp (sy -> sy_module, mod))
        !          1575:                continue;
        !          1576:        }
        !          1577:        else
        !          1578:            if (strcmp (sy -> sy_module, mymodule)
        !          1579:                    && strcmp (sy -> sy_module, "UNIV"))
        !          1580:                continue;
        !          1581: 
        !          1582:        if (strcmp (sy -> sy_name, id) == 0)
        !          1583:            return sy -> sy_type;
        !          1584:     }
        !          1585: 
        !          1586:     return NULLYP;
        !          1587: }
        !          1588: 
        !          1589: /*  */
        !          1590: 
        !          1591: pepsy (yp, top, level, id, val, var, arrayflg)
        !          1592: register YP    yp;
        !          1593: int    top,
        !          1594:        level,
        !          1595:         arrayflg;
        !          1596: char   *id,
        !          1597:        *val,
        !          1598:        *var;
        !          1599: {
        !          1600:     register int    i,
        !          1601:                    j;
        !          1602:     register char  *bp;
        !          1603:     char   *cp,
        !          1604:           *dp,
        !          1605:            *ep,
        !          1606:           *newid,
        !          1607:             buf1[BUFSIZ],
        !          1608:            buf2[BUFSIZ],
        !          1609:            buf3[BUFSIZ];
        !          1610:     register YP            y;
        !          1611:     register YV            yv;
        !          1612: 
        !          1613:     (void) strcpy (bp = buf2, var);
        !          1614:     bp += strlen (bp);
        !          1615:     /* Preserve the name of the field */
        !          1616:     yp->yp_varexp = new_string(yp -> yp_ptrname ? yp -> yp_ptrname : id);
        !          1617: 
        !          1618:     switch (yp -> yp_code) {
        !          1619:        case YP_BOOL: 
        !          1620:            if (aflag)
        !          1621:                printag (yp, level + 4, NULLCP);
        !          1622:            (void) fprintf (fdef, "%*schar    %s;\n", level * 4, "",
        !          1623:                     array(id, arrayflg));
        !          1624:            break;
        !          1625: 
        !          1626:        case YP_INT: 
        !          1627:        case YP_INTLIST:
        !          1628:        case YP_ENUMLIST:
        !          1629:            if (aflag)
        !          1630:                printag (yp, level + 4, NULLCP);
        !          1631:            (void) fprintf (fdef, "%*sint     %s;\n", level * 4, "",
        !          1632:                     array(id, arrayflg));
        !          1633:            if (yp -> yp_code == YP_INT)
        !          1634:                break;
        !          1635:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !          1636:                modsym_aux (yv -> yv_named, buf1);
        !          1637:                (void) fprintf (fdef, "#define\t%s_%s\t%d\n",
        !          1638:                        modsym (mymodule, top ? eval : id, "int"),
        !          1639:                        buf1, val2int (yv));
        !          1640:            }
        !          1641:            break;
        !          1642: 
        !          1643:        case YP_BIT: 
        !          1644:        case YP_BITLIST: 
        !          1645:            if (!top) {
        !          1646:                if (aflag)
        !          1647:                    printag (yp, level + 4, NULLCP);
        !          1648:                (void) fprintf (fdef, "%*sPE      %s;\n", level * 4, "",
        !          1649:                         array(id, arrayflg));
        !          1650:            }
        !          1651: #if 0
        !          1652:            if (fflag) {
        !          1653:                (void) fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
        !          1654:                (void) fprintf (fact,
        !          1655:                        "%*spe_free (%s),\n%*s%s = NULLPE;\n",
        !          1656:                        (level + 1) * 4, "", buf2,
        !          1657:                        (level + 2) * 4, "", buf2);
        !          1658:            }
        !          1659: #endif
        !          1660:            if (yp -> yp_code != YP_BITLIST)
        !          1661:                break;
        !          1662:            i = -1;
        !          1663:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
        !          1664:                if ((j = val2int (yv)) < 0)
        !          1665:                    pyyerror (yp, "invalid bit number in BIT STRING");
        !          1666:                else
        !          1667:                    if (j > i)
        !          1668:                        i = j;
        !          1669:            if (i < sizeof (int) * 8) {         /* NBBY */
        !          1670:                (void) fprintf (fdef, "#define\t%s\t\"\\020",
        !          1671:                        modsym (mymodule, top ? eval : id, "bits"));
        !          1672:                for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
        !          1673:                    if (yv -> yv_flags & YV_NAMED)
        !          1674:                        (void) fprintf (fdef, "\\0%o%s",
        !          1675:                                val2int (yv) + 1, yv -> yv_named);
        !          1676:                    else
        !          1677:                        (void) fprintf (fdef, "\\0%oBIT%d",
        !          1678:                                val2int (yv) + 1, val2int (yv));
        !          1679:                (void) fprintf (fdef, "\"\n");
        !          1680:            }
        !          1681:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !          1682:                modsym_aux (yv -> yv_named, buf1);
        !          1683:                (void) fprintf (fdef, "#define\t%s_%s\t%d\n",
        !          1684:                        modsym (mymodule, top ? eval : id, "bit"),
        !          1685:                        buf1, val2int (yv));
        !          1686:            }
        !          1687:            break;
        !          1688: 
        !          1689:        case YP_REAL: 
        !          1690:            if (aflag)
        !          1691:                printag (yp, level + 4, NULLCP);
        !          1692:            (void) fprintf (fdef, "%*sdouble    %s;\n", level * 4, "",
        !          1693:                     array(id, arrayflg));
        !          1694:            yp -> yp_varexp = new_string (buf2);
        !          1695:            break;
        !          1696: 
        !          1697:        case YP_OCT: 
        !          1698:            if (!top) {
        !          1699:                if (aflag)
        !          1700:                    printag (yp, level + 4, NULLCP);
        !          1701:                (void) fprintf (fdef, "%*sstruct qbuf *%s;\n", level * 4, "",
        !          1702:                         array(id, arrayflg));
        !          1703:            }
        !          1704: #if 0
        !          1705:            if (fflag) {
        !          1706:                (void) fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
        !          1707:                (void) fprintf (fact,
        !          1708:                        "%*sqb_free (%s),\n%*s%s = NULL;\n",
        !          1709:                        (level + 1) * 4, "", buf2,
        !          1710:                        (level + 2) * 4, "", buf2);
        !          1711:            }
        !          1712: #endif
        !          1713:            break;
        !          1714: 
        !          1715:        case YP_NULL: 
        !          1716:            if (aflag)
        !          1717:                printag (yp, level + 4, NULLCP);
        !          1718:            (void) fprintf (fdef, "%*schar    %s;\n", level * 4, "",
        !          1719:                     array(id, arrayflg));
        !          1720:            break;
        !          1721: 
        !          1722:        case YP_SEQ: 
        !          1723:        case YP_SET: 
        !          1724:        case YP_ANY: 
        !          1725:            if (!top) {
        !          1726:                if (aflag)
        !          1727:                    printag (yp, level + 4, NULLCP);
        !          1728:                (void) fprintf (fdef, "%*sPE      %s;\n", level * 4, "",
        !          1729:                         array(id, arrayflg));
        !          1730:            }
        !          1731: #if 0
        !          1732:            if (fflag) {
        !          1733:                (void) fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
        !          1734:                (void) fprintf (fact,
        !          1735:                        "%*spe_free (%s),\n%*s%s = NULLPE;\n",
        !          1736:                        (level + 1) * 4, "", buf2,
        !          1737:                        (level + 2) * 4, "", buf2);
        !          1738:            }
        !          1739: #endif
        !          1740:            break;
        !          1741: 
        !          1742:        case YP_SEQTYPE: 
        !          1743:        case YP_SETTYPE: 
        !          1744:            ep = yp -> yp_code != YP_SETTYPE ? "element" : "member";
        !          1745:            if ((cp = rindex (buf2, ' ')) && *++cp) {
        !          1746:                if ((dp = rindex (cp, '.')) && *++dp)
        !          1747:                    cp = dp;
        !          1748:                (void) sprintf (dp = buf1, "%*.*s",
        !          1749:                        cp - buf2, cp - buf2, buf2);
        !          1750:                dp += strlen (dp);
        !          1751:            }
        !          1752:            else {
        !          1753:                (void) strcpy (buf1, buf2);
        !          1754:                dp = NULL;
        !          1755:            }
        !          1756:            newid = yp -> yp_ptrname ? yp -> yp_ptrname : id;
        !          1757:            if (h2flag && top)
        !          1758:                (void) fprintf (fdef, "%*sint\tnelem;\n", level * 4, "");
        !          1759:            if (!top) {
        !          1760:                if (yp -> yp_structname)
        !          1761:                    id = yp -> yp_structname;
        !          1762:                else if (!Hflag)
        !          1763:                    id = gensym (ep, NULLCP);
        !          1764:                if (aflag)
        !          1765:                    printag (yp, level + 4, NULLCP);
        !          1766:                (void) fprintf (fdef, "%*sstruct %s {\n", level * 4, "", id);
        !          1767:                if (h2flag)
        !          1768:                    (void) fprintf (fdef, "%*sint\tnelem;\n", (level + 1) * 4, "");
        !          1769:            }
        !          1770:            if (dp)
        !          1771:                (void) strcpy (dp, newid);
        !          1772:            (void) strcpy (bp = buf2, id);
        !          1773:            bp += strlen (bp);
        !          1774: 
        !          1775:            if (!top)
        !          1776:                yp -> yp_declexp = new_string (id);
        !          1777: 
        !          1778:            if (dp)
        !          1779:                (void) strcpy (dp, newid);
        !          1780:            if ((y = yp -> yp_type) -> yp_code == YP_IDEFINED && hflag) {
        !          1781:                modsym_aux (y -> yp_identifier, cp = buf3);
        !          1782:                if (h2flag) {
        !          1783:                    cp += strlen(cp);
        !          1784:                    (void) sprintf (cp, "[n_%s]", PARVAL (yp->yp_declexp));
        !          1785:                    cp = buf3;
        !          1786:                }
        !          1787:            }
        !          1788:            else {
        !          1789:                switch (y -> yp_code) {
        !          1790:                case YP_SEQLIST:
        !          1791:                case YP_SETLIST:
        !          1792:                case YP_SETTYPE:
        !          1793:                case YP_SEQTYPE:
        !          1794:                case YP_CHOICE:
        !          1795:                case YP_IDEFINED:
        !          1796:                    cp = gensym (ep, h2flag ? PARVAL(yp->yp_declexp) : NULLCP);
        !          1797:                    break;
        !          1798:                default:
        !          1799:                    cp = gensym (ep, NULLCP);
        !          1800:                    break;
        !          1801:                }
        !          1802:            }
        !          1803:            (void) sprintf (bp, " -> %s", cp);
        !          1804: #if 0
        !          1805:            if (fflag) {
        !          1806:                if (!top) {
        !          1807:                    (void) fprintf (fact, "%*s{\n", level * 4, "");
        !          1808:                    level++;
        !          1809:                    if (h2flag) {
        !          1810:                        (void) fprintf (fact, "%*sint     n_%s;\n",
        !          1811:                                 level * 4, "", PARVAL (yp->yp_declexp));
        !          1812:                        (void) fprintf (fact, "%*sstruct %s *%s = %s;\n\n",
        !          1813:                                 level * 4, "", id, id, var);
        !          1814:                    }
        !          1815:                    else
        !          1816:                        (void) fprintf (fact, "%*sstruct %s *%s;\n\n",
        !          1817:                                 level * 4, "", id, id);
        !          1818:                }
        !          1819:                if (h2flag) {
        !          1820:                    (void) fprintf (fact, "%*sfor (n_%s = 0;\n",
        !          1821:                             level * 4, "", PARVAL(yp -> yp_declexp));
        !          1822:                    (void) fprintf (fact, "%*sn_%s < %s -> nelem;\n",
        !          1823:                             (level + 2) * 4, "", PARVAL(yp->yp_declexp), id);
        !          1824:                    (void) fprintf (fact, "%*sn_%s++) {\n",
        !          1825:                             (level + 2) * 4, "", PARVAL(yp->yp_declexp));
        !          1826:                }
        !          1827:                else {
        !          1828:                    (void) fprintf (fact,
        !          1829:                             "%*sfor (%s = %s; %s;) {\n",
        !          1830:                             level * 4, "", id, buf1, id);
        !          1831:                    (void) fprintf (fact, "%*sstruct %s *f_%s = %s -> next;\n\n",
        !          1832:                             (level + 1) * 4, "",
        !          1833:                             top ? modsym (mymodule, val, "type") : id,
        !          1834:                             id, id);
        !          1835:                }
        !          1836:            }
        !          1837: #endif
        !          1838:            level++;
        !          1839:            pepsy (y, 0, level, cp, ep, buf2, h2flag);
        !          1840:            *bp = NULL;
        !          1841:            if (y -> yp_code != YP_IDEFINED)
        !          1842:                free (cp);
        !          1843:            if (!h2flag)
        !          1844:                (void) fprintf (fdef, "\n%*sstruct %s *next;\n", level * 4, "",
        !          1845:                         top ? modsym (mymodule, val, "type") : id);
        !          1846: 
        !          1847:            level--;
        !          1848: 
        !          1849:            (void) strcpy (bp = buf2, var);
        !          1850:            bp += strlen (bp);
        !          1851: #if 0
        !          1852:            if (fflag) {
        !          1853:                if (!h2flag) {
        !          1854:                    (void) fprintf (fact, "\n%*sif (%s)\n%*sfree ((char *) %s);",
        !          1855:                             (level + 1) * 4, "", id,
        !          1856:                             (level + 2) * 4, "", id);
        !          1857:                    (void) fprintf (fact, "\n%*s%s = f_%s;", (level + 1) * 4, "",
        !          1858:                             id, id);
        !          1859:                }
        !          1860:                (void) fprintf (fact, "\n%*s}\n", level * 4, "");
        !          1861: 
        !          1862:                if (!top) {
        !          1863:                    if (h2flag)
        !          1864:                        (void) fprintf (fact, "\n%*s%s = NULL;\n",
        !          1865:                                 level * 4, "", var);
        !          1866:                    else
        !          1867:                        (void) fprintf (fact, "\n%*s%s = NULL;\n",
        !          1868:                                 level * 4, "", yp -> yp_varexp);
        !          1869: 
        !          1870:                    level--;
        !          1871:                    (void) fprintf (fact, "%*s}\n", level * 4, "");
        !          1872:                }
        !          1873:            }
        !          1874: #endif
        !          1875: 
        !          1876:            if (!top) {
        !          1877:                (void) fprintf (fdef, "%*s} *%s;\n", level * 4, "",
        !          1878:                         array(newid, arrayflg));
        !          1879:                if (!Hflag)
        !          1880:                    free (id);
        !          1881:            }
        !          1882:            break;
        !          1883: 
        !          1884:        case YP_SEQLIST: 
        !          1885:        case YP_SETLIST: 
        !          1886:            ep = yp -> yp_code != YP_SETLIST ? "element" : "member";
        !          1887:            if ((cp = rindex (buf2, ' ')) && *++cp) {
        !          1888:                if ((dp = rindex (cp, '.')) && *++dp)
        !          1889:                    cp = dp;
        !          1890:                (void) sprintf (dp = buf1, "%*.*s",
        !          1891:                        cp - buf2, cp - buf2, buf2);
        !          1892:                dp += strlen (dp);
        !          1893:            }
        !          1894:            else {
        !          1895:                (void) strcpy (buf1, buf2);
        !          1896:                dp = NULL;
        !          1897:            }
        !          1898:            newid = yp -> yp_ptrname ? yp -> yp_ptrname : id;
        !          1899:            if (!top) {
        !          1900:                if (yp -> yp_structname)
        !          1901:                    id = yp -> yp_structname;
        !          1902:                else if (!Hflag)
        !          1903:                    id = gensym (ep, NULLCP);
        !          1904:                if (aflag)
        !          1905:                    printag (yp, level + 4, NULLCP);
        !          1906:                (void) fprintf (fdef, "%*sstruct %s {\n", level * 4, "", id);
        !          1907: 
        !          1908:                if (dp)
        !          1909:                    (void) strcpy (dp, newid);
        !          1910: 
        !          1911: #if 0
        !          1912:                if (fflag) {
        !          1913:                    (void) fprintf (fact, "%*sif (%s) {\n",
        !          1914:                            level * 4, "", buf1);
        !          1915:                    i = 0;
        !          1916:                    for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1917:                        switch (y -> yp_code) {
        !          1918:                            case YP_BOOL:
        !          1919:                            case YP_INT:
        !          1920:                            case YP_INTLIST:
        !          1921:                            case YP_ENUMLIST:
        !          1922:                            case YP_REAL:
        !          1923:                            case YP_NULL:
        !          1924:                                continue;
        !          1925: 
        !          1926:                            default:
        !          1927:                                i = 1;
        !          1928:                                break;
        !          1929:                        }
        !          1930:                        break;
        !          1931:                    }
        !          1932:                    if (i)
        !          1933:                        (void) fprintf (fact, "%*sstruct %s *%s = %s;\n\n",
        !          1934:                                (level + 1) * 4, "", id, id, buf1);
        !          1935:                }
        !          1936: #endif
        !          1937:                (void) strcpy (bp = buf2, id);
        !          1938:                bp += strlen (bp);
        !          1939:                yp -> yp_declexp = new_string (id);
        !          1940: 
        !          1941:                level++;
        !          1942:            }
        !          1943:            if (dp)
        !          1944:                (void) strcpy (dp, newid);
        !          1945:            for (y = yp -> yp_type, i = 0; y; y = y -> yp_next) {
        !          1946:                if (y -> yp_flags & YP_OPTIONAL)
        !          1947:                    switch (y -> yp_code) {
        !          1948:                        case YP_BOOL:
        !          1949:                        case YP_INT:
        !          1950:                        case YP_INTLIST:
        !          1951:                        case YP_ENUMLIST:
        !          1952:                        case YP_REAL:
        !          1953:                        case YP_NULL:
        !          1954:                            {
        !          1955:                                char obuf[BUFSIZ];
        !          1956:                                
        !          1957:                                if (i == 0)
        !          1958:                                    (void) fprintf (fdef, "%*sint     optionals;\n",
        !          1959:                                             level * 4, "");
        !          1960:                                if (y -> yp_flags & YP_ID)
        !          1961:                                    modsym_aux (y -> yp_id, cp = buf1);
        !          1962:                                else {
        !          1963:                                    cp = gensym (ep, NULLCP);
        !          1964:                                    (void) strcpy (buf1, cp);
        !          1965:                                    free (cp);
        !          1966:                                    cp = buf1;
        !          1967:                                }
        !          1968:                                (void) sprintf (obuf, "%s_%s",
        !          1969:                                                modsym (mymodule,
        !          1970:                                                        top ? eval : id,
        !          1971:                                                        "opt"), cp);
        !          1972:                                (void) fprintf (fdef, "#define\t%s (0%08o)\n", obuf,
        !          1973:                                         1 << i);
        !          1974:                                y -> yp_optcontrol = new_string (obuf);
        !          1975:                                y -> yp_flags |= YP_OPTCONTROL;
        !          1976: 
        !          1977:                                i ++;
        !          1978:                                if (i >= 8 * sizeof (int))
        !          1979:                                    yyerror ("too many optionals in structure");
        !          1980:                            }
        !          1981:                            break;
        !          1982:                        }
        !          1983:            }
        !          1984:            if (i > 0) (void) fprintf (fdef, "\n");
        !          1985: 
        !          1986:            for (y = yp -> yp_type, i = 1; y; y = y -> yp_next, i++) {
        !          1987:                if (y -> yp_flags & YP_ID)
        !          1988:                    modsym_aux (y -> yp_id, cp = buf1);
        !          1989:                else
        !          1990:                    cp = gensym (ep, NULLCP);
        !          1991:                (void) sprintf (bp, " -> %s", cp);
        !          1992:                pepsy (y, 0, level, cp, ep, buf2, 0);
        !          1993:                *bp = NULL;
        !          1994:                if (!(y -> yp_flags & YP_ID))
        !          1995:                    free (cp);
        !          1996:                if (y -> yp_next)
        !          1997:                    (void) fprintf (fdef, "\n");
        !          1998:            }
        !          1999:            if (i == 1)
        !          2000:                (void) fprintf (fdef, "%*schar    dummy;\n", level * 4, "");
        !          2001:            if (!top) {
        !          2002:                level--;
        !          2003: 
        !          2004:                (void) strcpy (bp = buf2, var);
        !          2005:                bp += strlen (bp);
        !          2006: #if 0
        !          2007:                if (fflag) {
        !          2008:                    (void) fprintf (fact, "\n%*sif (%s)\n%*sfree ((char *) %s);\n%*s%s = NULL;\n",
        !          2009:                            (level + 1) * 4, "", yp -> yp_varexp,
        !          2010:                            (level + 2) * 4, "", yp -> yp_varexp,
        !          2011:                            (level + 1) * 4, "", yp -> yp_varexp);
        !          2012:                    (void) fprintf (fact, "%*s}\n", level * 4, "");
        !          2013:                }
        !          2014: #endif
        !          2015: 
        !          2016:                (void) fprintf (fdef, "%*s} *%s;\n", level * 4, "",
        !          2017:                         array(newid, arrayflg));
        !          2018:                if (!Hflag)
        !          2019:                    free (id);
        !          2020:            }
        !          2021:            break;
        !          2022: 
        !          2023:        case YP_CHOICE: 
        !          2024:            if ((cp = rindex (buf2, ' ')) && *++cp) {
        !          2025:                if ((dp = rindex (cp, '.')) && *++dp)
        !          2026:                    cp = dp;
        !          2027:                (void) sprintf (dp = buf1, "%*.*s",
        !          2028:                        cp - buf2, cp - buf2, buf2);
        !          2029:                dp += strlen (dp);
        !          2030:            }
        !          2031:            else {
        !          2032:                (void) strcpy (buf1, buf2);
        !          2033:                dp = NULL;
        !          2034:            }
        !          2035:            newid = yp -> yp_ptrname ? yp -> yp_ptrname : id;
        !          2036:            if (!top) {
        !          2037:                if (yp -> yp_structname)
        !          2038:                    id = yp -> yp_structname;
        !          2039:                else if (!Hflag)
        !          2040:                    id = gensym ("choice", NULLCP);
        !          2041:                if (aflag)
        !          2042:                    printag (yp, level + 4, NULLCP);
        !          2043:                (void) fprintf (fdef, "%*sstruct %s {\n", level * 4, "", id);
        !          2044: 
        !          2045:                if (dp)
        !          2046:                    (void) strcpy (dp, newid);
        !          2047: #if 0
        !          2048:                if (fflag) {
        !          2049:                    (void) fprintf (fact, "%*sif (%s) {\n%*sstruct %s *%s = %s;\n\n",
        !          2050:                            level * 4, "", buf1,
        !          2051:                            (level + 1) * 4, "", id, id, buf1);
        !          2052:                }
        !          2053: #endif
        !          2054:                (void) strcpy (bp = buf2, id);
        !          2055:                bp += strlen (bp);
        !          2056:                yp -> yp_declexp = new_string (id);
        !          2057: 
        !          2058:                level++;
        !          2059:            }
        !          2060:            if (dp)
        !          2061:                (void) strcpy (dp, newid);
        !          2062:            (void) fprintf (fdef, "%*sint     offset;\n", level * 4, "");
        !          2063: #if 0
        !          2064:            if (fflag)
        !          2065:                (void) fprintf (fact, "%*sswitch (%s -> offset) {\n",
        !          2066:                        level * 4, "", id);
        !          2067: #endif
        !          2068:            if (top)
        !          2069:                cp = modsym (mymodule, val, "type");
        !          2070:            else
        !          2071:                cp = id;
        !          2072:            (void) sprintf (ep = buf1, "%s_", cp);
        !          2073:            ep += strlen (ep);
        !          2074:            for (y = yp -> yp_type, i = 1; y; y = y -> yp_next, i++) {
        !          2075:                if (y -> yp_flags & YP_ID)
        !          2076:                    modsym_aux (y -> yp_id, ep);
        !          2077:                else
        !          2078:                    (void) sprintf (ep, "%d", i);
        !          2079:                y -> yp_offset = new_string (buf1);
        !          2080:                (void) fprintf (fdef, "#define\t%s\t%d\n", y -> yp_offset, i);
        !          2081:            }
        !          2082:            (void) fprintf (fdef, "\n%*sunion {\n", level * 4, "");
        !          2083:            level++;
        !          2084:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          2085:                char    *t;
        !          2086: 
        !          2087:                if (y -> yp_flags & YP_ID)
        !          2088:                    modsym_aux (y -> yp_id, cp = buf1);
        !          2089:                else
        !          2090:                    cp = gensym ("choice", NULLCP);
        !          2091: #if 0
        !          2092:                if (fflag) {
        !          2093:                    (void) fprintf (fact, "%*scase %s:\n", level * 4, "",
        !          2094:                            y -> yp_offset);
        !          2095:                    level++;
        !          2096:                }
        !          2097: #endif
        !          2098:                (void) sprintf (bp, " -> un.%s", cp);
        !          2099:                pepsy (y, 0, level, cp, "choice", buf2, 0);
        !          2100:     /* prefix yp_varexp (field name) with un. so we will generate offsets that
        !          2101:      * allow for the union all the CHOICE fields are imbedded in
        !          2102:      */
        !          2103:                t = y->yp_varexp;
        !          2104:                y->yp_varexp = my_strcat("un.",  t);
        !          2105:                free(t);
        !          2106: 
        !          2107:                *bp = NULL;
        !          2108: #if 0
        !          2109:                if (fflag) {
        !          2110:                    (void) fprintf (fact, "%*sbreak;\n", level * 4, "");
        !          2111:                    if (y -> yp_next)
        !          2112:                        (void) fprintf (fact, "\n");
        !          2113:                    level--;
        !          2114:                }
        !          2115: #endif
        !          2116:                if (!(y -> yp_flags & YP_ID))
        !          2117:                    free (cp);
        !          2118:                if (y -> yp_next)
        !          2119:                    (void) fprintf (fdef, "\n");
        !          2120:            }
        !          2121:            level--;
        !          2122:            (void) fprintf (fdef, "%*s}       un;\n", level * 4, "");
        !          2123: #if 0
        !          2124:            if (fflag)
        !          2125:                (void) fprintf (fact, "%*s}\n", level * 4, "");
        !          2126: #endif
        !          2127:            if (!top) {
        !          2128:                level--;
        !          2129: 
        !          2130:                (void) strcpy (bp = buf2, var);
        !          2131:                bp += strlen (bp);
        !          2132: #if 0
        !          2133:                if (fflag) {
        !          2134:                    (void) fprintf (fact, "\n%*sif (%s)\n%*sfree ((char *) %s);\n%*s%s = NULL;\n",
        !          2135:                            (level + 1) * 4, "", yp -> yp_varexp,
        !          2136:                            (level + 2) * 4, "", yp -> yp_varexp,
        !          2137:                            (level + 1) * 4, "", yp -> yp_varexp);
        !          2138:                    (void) fprintf (fact, "%*s}\n", level * 4, "");
        !          2139:                }
        !          2140: #endif
        !          2141: 
        !          2142:                (void) fprintf (fdef, "%*s} *%s;\n", level * 4, "",
        !          2143:                         array(newid, arrayflg));
        !          2144:                if (!Hflag)
        !          2145:                    free (id);
        !          2146:            }
        !          2147:            break;
        !          2148: 
        !          2149:        case YP_OID: 
        !          2150:            if (!top) {
        !          2151:                if (aflag)
        !          2152:                    printag (yp, level + 4, NULLCP);
        !          2153:                (void) fprintf (fdef, "%*sOID     %s;\n", level * 4, "",
        !          2154:                         array(id, arrayflg));
        !          2155:            }
        !          2156: #if 0
        !          2157:            if (fflag) {
        !          2158:                (void) fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
        !          2159:                (void) fprintf (fact,
        !          2160:                        "%*soid_free (%s),\n%*s%s = NULLOID;\n",
        !          2161:                        (level + 1) * 4, "", buf2,
        !          2162:                        (level + 2) * 4, "", buf2);
        !          2163:            }
        !          2164: #endif
        !          2165:            break;
        !          2166: 
        !          2167:        case YP_IDEFINED: 
        !          2168:            if (aflag)
        !          2169:                printag (yp, level + 4, NULLCP);
        !          2170:            {
        !          2171:                /* Predefined Universal Type */
        !          2172:                struct univ_typ *p;
        !          2173:                if ((p = univtyp(yp->yp_identifier))) {
        !          2174:                    (void) fprintf (fdef, "%*s%s%s;\n", level * 4, "",
        !          2175:                        p->univ_data, array(id, arrayflg));
        !          2176:                    /*
        !          2177:                     if (fflag)
        !          2178:                         ferr(1, "pepsy:YP_IDEFINED:fflag not implemented\n");
        !          2179:                    */
        !          2180:                    break;
        !          2181:                }
        !          2182:            }
        !          2183:            (void) fprintf (fdef, "%*sstruct %s *%s;\n", level * 4, "",
        !          2184:                    modsym (yp -> yp_module, yp -> yp_identifier, "type"),
        !          2185:                    array(id, arrayflg));
        !          2186: #if 0
        !          2187:            if (fflag) {
        !          2188:                (void) fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
        !          2189:                (void) fprintf (fact,
        !          2190:                        "%*s%s (%s),\n%*s%s = NULL;\n",
        !          2191:                        (level + 1) * 4, "",
        !          2192:                        modsym (yp -> yp_module, yp -> yp_identifier, "free"),
        !          2193:                        buf2, (level + 2) * 4, "", buf2);
        !          2194:            }
        !          2195: #endif
        !          2196:            break;
        !          2197: 
        !          2198:        default: 
        !          2199:            myyerror ("unknown type: %d", yp -> yp_code);
        !          2200:     }
        !          2201: }
        !          2202: 
        !          2203: /*  */
        !          2204: 
        !          2205: static printag (yp, level, pullup)
        !          2206: register YP    yp;
        !          2207: int    level;
        !          2208: char   *pullup;
        !          2209: {
        !          2210:     (void) fprintf (fdef, "%*s/* ", level * 4, "");
        !          2211:     switch (yp -> yp_code) {
        !          2212:        case YP_IDEFINED: 
        !          2213:            if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
        !          2214:                (void) fprintf (fdef, "%s.", yp -> yp_module);
        !          2215:            (void) fprintf (fdef, "%s", yp -> yp_identifier);
        !          2216:            break;
        !          2217: 
        !          2218:        default: 
        !          2219:            (void) fprintf (fdef, "%s", tags[yp -> yp_code]);
        !          2220:            break;
        !          2221:     }
        !          2222:     if (pullup)
        !          2223:        (void) fprintf (fdef, " pulled up from %s", pullup);
        !          2224:     (void) fprintf (fdef, " */\n");
        !          2225: }
        !          2226: 
        !          2227: /*  */
        !          2228: 
        !          2229: static xalloc (yp, top, level, arg, type, brackets)
        !          2230: register YP    yp;
        !          2231: int    top,
        !          2232:        level,
        !          2233:        brackets;
        !          2234: char   *arg,
        !          2235:        *type;
        !          2236: {
        !          2237:     int            didone;
        !          2238:     register YP            y;
        !          2239: 
        !          2240:     if (hflag && !arg && !type)
        !          2241:        return;
        !          2242: 
        !          2243:     didone = 0;
        !          2244: 
        !          2245:     if (arg && type) {
        !          2246:        if (brackets && !didone) {
        !          2247:            (void) printf ("%*s%%{\n", level * 4, "");
        !          2248:            level++, didone++;
        !          2249:        }
        !          2250: 
        !          2251:        if (h2flag && (yp -> yp_code == YP_SEQTYPE ||
        !          2252:                       yp -> yp_code == YP_SETTYPE)) {
        !          2253:            (void) printf ("%*s{\n%*sPE      xx_pe = prim2%s ($$);\n\n",
        !          2254:                    level * 4, "", (level +1) * 4, "",
        !          2255:                    yp -> yp_code == YP_SEQTYPE ? "seq" : "set");
        !          2256:            (void) printf ("%*sn_%s = xx_pe -> pe_cardinal > 0 ",
        !          2257:                    (level + 1) * 4, "", arg);
        !          2258:            (void) printf ("? xx_pe -> pe_cardinal : 0;\n%*s}\n", level * 4, "");
        !          2259:            (void) printf ("%*sif ((*(%s) = (struct %s *)\n",
        !          2260:                    level * 4, "", arg, type);
        !          2261:            (void) printf ("%*scalloc (1 + (unsigned) n_%s, sizeof **(%s)",
        !          2262:                    (level + 2) * 4, "", arg, arg);
        !          2263:            (void) printf (")) == ((struct %s *) 0)) {\n", type);
        !          2264:            (void) printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n",
        !          2265:                    (level + 1) * 4, "");
        !          2266:            (void) printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !          2267:                    level * 4, "");
        !          2268:            (void) printf ("%*s(*%s) -> nelem = n_%s;\n", level * 4, "", arg, arg);
        !          2269:            (void) printf ("%*sn_%s = 0;\n", level * 4, "", arg);
        !          2270:        } else {
        !          2271:            (void) printf ("%*sif ((*(%s) = (struct %s *)\n",
        !          2272:                    level * 4, "", arg, type);
        !          2273:            (void) printf ("%*scalloc (1, sizeof **(%s))) == ((struct %s *) 0)) {\n",
        !          2274:                    (level + 2) * 4, "", arg, type);
        !          2275:            (void) printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n",
        !          2276:                    (level + 1) * 4, "");
        !          2277:            (void) printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !          2278:                    level * 4, "");
        !          2279:        }
        !          2280:     }
        !          2281:     switch (yp -> yp_code) {
        !          2282:     case YP_SEQTYPE:
        !          2283:     case YP_SETTYPE:
        !          2284:        if (top) break;
        !          2285:     case YP_CHOICE:
        !          2286:     case YP_SEQLIST:
        !          2287:     case YP_SETLIST:
        !          2288:        for (y = yp -> yp_type; y; y = y -> yp_next)
        !          2289:            switch (y -> yp_code) {
        !          2290:            case YP_SEQTYPE: 
        !          2291:            case YP_SETTYPE:
        !          2292:                if (h2flag && (yp -> yp_code == YP_SETLIST ||
        !          2293:                               yp -> yp_code == YP_SEQLIST)) {
        !          2294:                    /* include allocation here - no chance later */
        !          2295:                    if (brackets && !didone) {
        !          2296:                        (void) printf ("%*s%%{\n", level * 4, "");
        !          2297:                        level++, didone++;
        !          2298:                    }
        !          2299:                    if (y -> yp_declexp)
        !          2300:                        (void) printf ("%*s%s = &(%s);\n", level * 4, "",
        !          2301:                                y -> yp_declexp,
        !          2302:                                y -> yp_varexp);
        !          2303:                    xalloc (y, top, level, y -> yp_declexp,
        !          2304:                            y -> yp_declexp, 0);
        !          2305:                }
        !          2306:                /* and continue ... */
        !          2307:            case YP_SEQLIST: 
        !          2308:            case YP_SETLIST: 
        !          2309:            case YP_CHOICE:
        !          2310:                if (brackets && !didone) {
        !          2311:                    (void) printf ("%*s%%{\n", level * 4, "");
        !          2312:                    level++, didone++;
        !          2313:                }
        !          2314:                (void) printf ("%*s%s = &(%s);\n",
        !          2315:                        level * 4, "", y -> yp_declexp,
        !          2316:                        y -> yp_varexp);
        !          2317:                break;
        !          2318:            }
        !          2319:        break;
        !          2320:     }
        !          2321: 
        !          2322:     if (brackets && didone) {
        !          2323:        level--;
        !          2324:        (void) printf ("%*s%%}\n", level * 4, "");
        !          2325:     }
        !          2326: }
        !          2327: 
        !          2328: 
        !          2329: static balloc (yp, var, action2, level)
        !          2330: register YP    yp;
        !          2331: char   *var, *action2;
        !          2332: int    level;
        !          2333: {
        !          2334:     (void) printf ("\n%*s%%{\n", level * 4, "");
        !          2335:     level++;
        !          2336: 
        !          2337:     (void) printf ("%*sif ((%s%s = prim2bit (pe_cpy ($$))) == NULLPE) {\n",
        !          2338:            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          2339:     (void) printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n", (level + 1) * 4, "");
        !          2340:     (void) printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "", level * 4, "");
        !          2341: 
        !          2342:     if (action2)
        !          2343:        (void) printf ("\n%*s%s\n", level * 4, "", action2);
        !          2344: 
        !          2345:     level--;
        !          2346:     (void) printf ("%*s%%}", level * 4, "");
        !          2347: }
        !          2348: 
        !          2349: #ifdef notdef
        !          2350: static qalloc (yp, var, action2, level)
        !          2351: register YP    yp;
        !          2352: char   *var,
        !          2353:        *action2;
        !          2354: int    level;
        !          2355: {
        !          2356:     (void) printf ("\n%*s%%{\n", level * 4, "");
        !          2357:     level++;
        !          2358: 
        !          2359:     (void) printf ("%*sif ((%s%s = str2qb ($$, $$_len, 1)) == ((struct qbuf *) 0)) {\n",
        !          2360:            level * 4, "", var, SVAL (yp -> yp_varexp));
        !          2361:     (void) printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n", (level + 1) * 4, "");
        !          2362:     (void) printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "", level * 4, "");
        !          2363: 
        !          2364:     if (action2)
        !          2365:        (void) printf ("\n%*s%s\n", level * 4, "", action2);
        !          2366: 
        !          2367:     level--;
        !          2368:     (void) printf ("%*s%%}", level * 4, "");
        !          2369: }
        !          2370: #endif
        !          2371: 
        !          2372: /*  */
        !          2373: 
        !          2374: static choice_pullup (yp, partial)
        !          2375: register YP    yp;
        !          2376: int    partial;
        !          2377: {
        !          2378:     register YP           *x,
        !          2379:                    y,
        !          2380:                    z,
        !          2381:                   *z1,
        !          2382:                    z2,
        !          2383:                    z3;
        !          2384: 
        !          2385:     for (x = &yp -> yp_type; y = *x; x = &y -> yp_next) {
        !          2386:        if (y -> yp_flags & (YP_TAG | YP_BOUND))
        !          2387:            continue;
        !          2388: 
        !          2389:        switch (y -> yp_code) {
        !          2390:            case YP_IDEFINED:
        !          2391:                if ((z = lookup_type (y -> yp_module, y -> yp_identifier))
        !          2392:                        == NULLYP
        !          2393:                        || z -> yp_code != YP_CHOICE)
        !          2394:                    continue;
        !          2395:                choice_pullup (z2 = copy_type (z), CH_FULLY);
        !          2396:                goto patch;
        !          2397: 
        !          2398:            case YP_CHOICE:
        !          2399:                choice_pullup (z2 = copy_type (y), CH_FULLY);
        !          2400: patch: ;
        !          2401:                if (partial) {
        !          2402:                    *x = z2;
        !          2403:                    z2 -> yp_next =  y -> yp_next;
        !          2404:                    continue;
        !          2405:                }
        !          2406:                break;
        !          2407: 
        !          2408:            default:
        !          2409:                continue;
        !          2410:        }
        !          2411:        z = z3 = z2 -> yp_type;
        !          2412:        for (z1 = &z -> yp_next; z2 = *z1; z1 = &z2 -> yp_next)
        !          2413:            z3 = z2;
        !          2414:        *z1 = y -> yp_next;
        !          2415:        *x = z;
        !          2416:        y = z3;
        !          2417:     }
        !          2418: }
        !          2419: 
        !          2420: /*  */
        !          2421: 
        !          2422: static components_pullup (yp)
        !          2423: register YP    yp;
        !          2424: {
        !          2425:     register YP    *x,
        !          2426:                    y,
        !          2427:                    z,
        !          2428:                    z1,
        !          2429:                    z2;
        !          2430: 
        !          2431:     for (x = &yp -> yp_type; y = *x; x = &y -> yp_next) {
        !          2432:        if (!(y -> yp_flags & YP_COMPONENTS))
        !          2433:            continue;
        !          2434: 
        !          2435:        switch (y -> yp_code) {
        !          2436:            case YP_SEQLIST:
        !          2437:            case YP_SETLIST:
        !          2438:                z = y;
        !          2439:                break;
        !          2440: 
        !          2441:            case YP_IDEFINED:
        !          2442:                if ((z = lookup_type (y -> yp_module, y -> yp_identifier))
        !          2443:                        == NULLYP) {
        !          2444:                    warning ("COMPONENTS OF target \"%s\" is undefined",
        !          2445:                             y -> yp_identifier);
        !          2446:                    continue;
        !          2447:                }
        !          2448:                break;
        !          2449:        }
        !          2450:        if (yp -> yp_code != z -> yp_code) {
        !          2451:            warning ("COMPONENTS OF target \"%s\" is wrong type, should be %s",
        !          2452:                     y -> yp_code == YP_IDEFINED ? y -> yp_identifier
        !          2453:                                                 : y -> yp_id ? y -> yp_id
        !          2454:                                                 : "",
        !          2455:                     yp -> yp_code == YP_SEQLIST ? "SEQUENCE" : "SET");
        !          2456:            continue;
        !          2457:        }
        !          2458:        if (z -> yp_type == NULLYP)
        !          2459:            continue;
        !          2460:        components_pullup (z = copy_type (z));
        !          2461:        *x = z2 = z -> yp_type;
        !          2462:        for (x = &z -> yp_type; z1 = *x; x = &z1 -> yp_next)
        !          2463:            z2 = z1;
        !          2464:        *x = y -> yp_next;
        !          2465:        y = z2;
        !          2466:     }
        !          2467: }
        !          2468: 
        !          2469: /*    VALUE HANDLING */
        !          2470: 
        !          2471: static int  val2int (yv)
        !          2472: register YV    yv;
        !          2473: {
        !          2474:     switch (yv -> yv_code) {
        !          2475:        case YV_BOOL:
        !          2476:        case YV_NUMBER:
        !          2477:            return yv -> yv_number;
        !          2478: 
        !          2479:        case YV_STRING:
        !          2480:            yyerror ("need an integer, not a string");
        !          2481: 
        !          2482:        case YV_IDEFINED:
        !          2483:        case YV_IDLIST:
        !          2484:            yyerror ("haven't written symbol table for values yet");
        !          2485: 
        !          2486:        case YV_NULL:
        !          2487:            yyerror ("need an integer, not NULL");
        !          2488: 
        !          2489:        default:
        !          2490:            myyerror ("unknown value: %d", yv -> yv_code);
        !          2491:     }
        !          2492: /* NOTREACHED */
        !          2493: }
        !          2494: 
        !          2495: static double  val2real (yv)
        !          2496: register YV    yv;
        !          2497: {
        !          2498:     switch (yv -> yv_code) {
        !          2499:        case YV_NUMBER:
        !          2500:            return yv -> yv_number;
        !          2501: 
        !          2502:        case YV_REAL:
        !          2503:            return yv -> yv_real;
        !          2504: 
        !          2505:        case YV_STRING:
        !          2506:            yyerror ("need an integer, not a string");
        !          2507: 
        !          2508:        case YV_IDEFINED:
        !          2509:        case YV_IDLIST:
        !          2510:            yyerror ("haven't written symbol table for values yet");
        !          2511: 
        !          2512:        case YV_NULL:
        !          2513:            yyerror ("need an integer, not NULL");
        !          2514: 
        !          2515:        default:
        !          2516:            myyerror ("unknown value: %d", yv -> yv_code);
        !          2517:     }
        !          2518: /* NOTREACHED */
        !          2519: }
        !          2520: 
        !          2521: /*  */
        !          2522: 
        !          2523: static val2prf (yv, level)
        !          2524: register YV    yv;
        !          2525: int    level;
        !          2526: {
        !          2527:     register YV    y;
        !          2528: 
        !          2529:     if (yv -> yv_flags & YV_ID)
        !          2530:        (void) printf ("%s ", yv -> yv_id);
        !          2531: 
        !          2532:     if (yv -> yv_flags & YV_TYPE)      /* will this REALLY work??? */
        !          2533:        do_type1 (yv -> yv_type, 0, level, NULLCP, NULLCP, NULLCP, NULL);
        !          2534: 
        !          2535:     switch (yv -> yv_code) {
        !          2536:        case YV_BOOL: 
        !          2537:            (void) printf (yv -> yv_number ? "TRUE" : "FALSE");
        !          2538:            break;
        !          2539: 
        !          2540:        case YV_NUMBER: 
        !          2541:            if (yv -> yv_named)
        !          2542:                (void) printf ("%s", yv -> yv_named);
        !          2543:            else
        !          2544:                (void) printf ("%d", yv -> yv_number);
        !          2545:            break;
        !          2546: 
        !          2547:        case YV_REAL:
        !          2548:            dump_real (yv -> yv_real);
        !          2549:            break;
        !          2550: 
        !          2551:        case YV_STRING: 
        !          2552:            (void) printf ("\"%s\"", yv -> yv_string);
        !          2553:            break;
        !          2554: 
        !          2555:        case YV_IDEFINED: 
        !          2556:            if (yv -> yv_module)
        !          2557:                (void) printf ("%s.", yv -> yv_module);
        !          2558:            (void) printf ("%s", yv -> yv_identifier);
        !          2559:            break;
        !          2560: 
        !          2561:        case YV_IDLIST: 
        !          2562:        case YV_VALIST: 
        !          2563:            (void) printf ("{");
        !          2564:            for (y = yv -> yv_idlist; y; y = y -> yv_next) {
        !          2565:                (void) printf (" ");
        !          2566:                val2prf (y, level + 1);
        !          2567:                (void) printf (y -> yv_next ? ", " : " ");
        !          2568:            }
        !          2569:            (void) printf ("}");
        !          2570:            break;
        !          2571: 
        !          2572:        case YV_NULL: 
        !          2573:            (void) printf ("NULL");
        !          2574:            break;
        !          2575: 
        !          2576:        default: 
        !          2577:            myyerror ("unknown value: %d", yv -> yv_code);
        !          2578:        /* NOTREACHED */
        !          2579:     }
        !          2580: }
        !          2581: static dump_real (r)
        !          2582: double r;
        !          2583: {
        !          2584: #ifndef        BSD44
        !          2585:        extern char *ecvt ();
        !          2586:        char    *cp;
        !          2587:        char    sbuf[128];
        !          2588:        int     decpt, sign;
        !          2589: 
        !          2590:        cp = ecvt (r, 20, &decpt, &sign);
        !          2591:        (void) strcpy (sbuf, cp);       /* cp gets overwritten by printf */
        !          2592:        (void) printf ("{ %s%s, 10, %d }", sign ? "-" : "", sbuf,
        !          2593:                decpt - strlen (sbuf));
        !          2594: #else
        !          2595:     register char   *cp,
        !          2596:                    *dp,
        !          2597:                    *sp;
        !          2598:     char    sbuf[128];
        !          2599: 
        !          2600:     (void) sprintf (sbuf, "%.19e", r);
        !          2601:     if (*(dp = sbuf) == '-')
        !          2602:        sp = "-", dp++;
        !          2603:     else
        !          2604:        sp = "";
        !          2605:     
        !          2606:     if (dp[1] != '.' || (cp = index (dp, 'e')) == NULL) {
        !          2607:        (void) printf ("{ 0, 10, 0 } -- %s --", sbuf);
        !          2608:        return;
        !          2609:     }
        !          2610:     *cp++ = NULL;
        !          2611:     (void) printf ("{ %s%c%s, 10, %d }",
        !          2612:            sp, *dp, dp + 2, atoi (cp) - strlen (dp + 2));
        !          2613: #endif
        !          2614: }
        !          2615: 
        !          2616: /*  */
        !          2617: 
        !          2618: static int  dfl2int (yp)
        !          2619: register YP    yp;
        !          2620: {
        !          2621:     register YV            yv,
        !          2622:                    y;
        !          2623: 
        !          2624:     yv = yp -> yp_default;
        !          2625:     switch (yv -> yv_code) {
        !          2626:        case YV_BOOL:
        !          2627:        case YV_NUMBER:
        !          2628:            return yv -> yv_number;
        !          2629: 
        !          2630:        case YV_STRING:
        !          2631:            yyerror ("need an integer, not a string");
        !          2632: 
        !          2633:        case YV_REAL:
        !          2634:            yyerror ("need an integer, not a real");
        !          2635: 
        !          2636:        case YV_IDEFINED:
        !          2637:            for (y = yp -> yp_value; y; y = y -> yv_next)
        !          2638:                if (y -> yv_code == YV_NUMBER
        !          2639:                        && (y -> yv_flags & YV_NAMED)
        !          2640:                        && strcmp (yv -> yv_identifier, y -> yv_named) == 0)
        !          2641:                    return y -> yv_number;
        !          2642:            /* and fall */
        !          2643: 
        !          2644:        case YV_IDLIST:
        !          2645:            yyerror ("haven't written symbol table for values yet");
        !          2646: 
        !          2647:        case YV_NULL:
        !          2648:            yyerror ("need an integer, not NULL");
        !          2649: 
        !          2650:        default:
        !          2651:            myyerror ("unknown value: %d", yv -> yv_code);
        !          2652:     }
        !          2653: /* NOTREACHED */
        !          2654: }
        !          2655: 
        !          2656: /*    DEBUG */
        !          2657: 
        !          2658: print_type (yp, level)
        !          2659: register YP    yp;
        !          2660: register int   level;
        !          2661: {
        !          2662:     register YP            y;
        !          2663:     register YV            yv;
        !          2664: 
        !          2665:     if (yp == NULLYP)
        !          2666:        return;
        !          2667: 
        !          2668:     (void) fprintf (stderr, "%*scode=0x%x flags=%s direction=0x%x\n", level * 4, "",
        !          2669:            yp -> yp_code, sprintb (yp -> yp_flags, YPBITS),
        !          2670:            yp -> yp_direction);
        !          2671:     (void) fprintf (stderr,
        !          2672:            "%*sintexp=\"%s\" strexp=\"%s\" prfexp=0%o declexp=\"%s\" varexp=\"%s\"\n",
        !          2673:            level * 4, "", yp -> yp_intexp, yp -> yp_strexp, yp -> yp_prfexp,
        !          2674:            yp -> yp_declexp, yp -> yp_varexp);
        !          2675:     if (yp -> yp_param_type)
        !          2676:        (void) fprintf (stderr, "%*sparameter type=\"%s\"\n", level * 4, "",
        !          2677:                 yp -> yp_param_type);
        !          2678:     if (yp -> yp_action0)
        !          2679:        (void) fprintf (stderr, "%*saction0 at line %d=\"%s\"\n", level * 4, "",
        !          2680:                yp -> yp_act0_lineno, yp -> yp_action0);
        !          2681:     if (yp -> yp_action05)
        !          2682:        (void) fprintf (stderr, "%*saction05 at line %d=\"%s\"\n", level * 4, "",
        !          2683:                yp -> yp_act05_lineno, yp -> yp_action05);
        !          2684:     if (yp -> yp_action1)
        !          2685:        (void) fprintf (stderr, "%*saction1 at line %d=\"%s\"\n", level * 4, "",
        !          2686:                yp -> yp_act1_lineno, yp -> yp_action1);
        !          2687:     if (yp -> yp_action2)
        !          2688:        (void) fprintf (stderr, "%*saction2 at line %d=\"%s\"\n", level * 4, "",
        !          2689:                yp -> yp_act2_lineno, yp -> yp_action2);
        !          2690:     if (yp -> yp_action3)
        !          2691:        (void) fprintf (stderr, "%*saction3 at line %d=\"%s\"\n", level * 4, "",
        !          2692:                yp -> yp_act3_lineno, yp -> yp_action3);
        !          2693: 
        !          2694:     if (yp -> yp_flags & YP_TAG) {
        !          2695:        (void) fprintf (stderr, "%*stag class=0x%x value=0x%x\n", level * 4, "",
        !          2696:                yp -> yp_tag -> yt_class, yp -> yp_tag -> yt_value);
        !          2697:        print_value (yp -> yp_tag -> yt_value, level + 1);
        !          2698:     }
        !          2699: 
        !          2700:     if (yp -> yp_flags & YP_DEFAULT) {
        !          2701:        (void) fprintf (stderr, "%*sdefault=0x%x\n", level * 4, "", yp -> yp_default);
        !          2702:        print_value (yp -> yp_default, level + 1);
        !          2703:     }
        !          2704: 
        !          2705:     if (yp -> yp_flags & YP_ID)
        !          2706:        (void) fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yp -> yp_id);
        !          2707: 
        !          2708:     if (yp -> yp_flags & YP_BOUND)
        !          2709:        (void) fprintf (stderr, "%*sbound=\"%s\"\n", level * 4, "", yp -> yp_bound);
        !          2710: 
        !          2711:     if (yp -> yp_offset)
        !          2712:        (void) fprintf (stderr, "%*soffset=\"%s\"\n", level * 4, "", yp -> yp_offset);
        !          2713: 
        !          2714:     switch (yp -> yp_code) {
        !          2715:        case YP_INTLIST:
        !          2716:         case YP_ENUMLIST:
        !          2717:        case YP_BITLIST:
        !          2718:            (void) fprintf (stderr, "%*svalue=0x%x\n", level * 4, "", yp -> yp_value);
        !          2719:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !          2720:                print_value (yv, level + 1);
        !          2721:                (void) fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          2722:            }
        !          2723:            break;
        !          2724: 
        !          2725:        case YP_SEQTYPE:
        !          2726:        case YP_SEQLIST:
        !          2727:        case YP_SETTYPE:
        !          2728:        case YP_SETLIST:
        !          2729:        case YP_CHOICE:
        !          2730:            (void) fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yp -> yp_type);
        !          2731:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          2732:                print_type (y, level + 1);
        !          2733:                (void) fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          2734:            }
        !          2735:            break;
        !          2736: 
        !          2737:        case YP_IDEFINED:
        !          2738:            (void) fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
        !          2739:                    level * 4, "", yp -> yp_module ? yp -> yp_module : "",
        !          2740:                    yp -> yp_identifier);
        !          2741:            break;
        !          2742: 
        !          2743:        default:
        !          2744:            break;
        !          2745:     }
        !          2746: }
        !          2747: 
        !          2748: /*  */
        !          2749: 
        !          2750: static print_value (yv, level)
        !          2751: register YV    yv;
        !          2752: register int   level;
        !          2753: {
        !          2754:     register YV            y;
        !          2755: 
        !          2756:     if (yv == NULLYV)
        !          2757:        return;
        !          2758: 
        !          2759:     (void) fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
        !          2760:            yv -> yv_code, sprintb (yv -> yv_flags, YVBITS));
        !          2761: 
        !          2762:     if (yv -> yv_action)
        !          2763:        (void) fprintf (stderr, "%*saction at line %d=\"%s\"\n", level * 4, "",
        !          2764:                yv -> yv_act_lineno, yv -> yv_action);
        !          2765: 
        !          2766:     if (yv -> yv_flags & YV_ID)
        !          2767:        (void) fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yv -> yv_id);
        !          2768: 
        !          2769:     if (yv -> yv_flags & YV_NAMED)
        !          2770:        (void) fprintf (stderr, "%*snamed=\"%s\"\n", level * 4, "", yv -> yv_named);
        !          2771: 
        !          2772:     if (yv -> yv_flags & YV_TYPE) {
        !          2773:        (void) fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yv -> yv_type);
        !          2774:        print_type (yv -> yv_type, level + 1);
        !          2775:     }
        !          2776: 
        !          2777:     switch (yv -> yv_code) {
        !          2778:        case YV_NUMBER:
        !          2779:        case YV_BOOL:
        !          2780:            (void) fprintf (stderr, "%*snumber=0x%x\n", level * 4, "",
        !          2781:                    yv -> yv_number);
        !          2782:            break;
        !          2783: 
        !          2784:        case YV_STRING:
        !          2785:            (void) fprintf (stderr, "%*sstring=0x%x\n", level * 4, "",
        !          2786:                    yv -> yv_string);
        !          2787:            break;
        !          2788: 
        !          2789:        case YV_IDEFINED:
        !          2790:            if (yv -> yv_flags & YV_BOUND)
        !          2791:                (void) fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
        !          2792:                        level * 4, "", yv -> yv_module, yv -> yv_identifier);
        !          2793:            else
        !          2794:                (void) fprintf (stderr, "%*sbound identifier=\"%s\"\n",
        !          2795:                        level * 4, "", yv -> yv_identifier);
        !          2796:            break;
        !          2797: 
        !          2798:        case YV_IDLIST:
        !          2799:        case YV_VALIST:
        !          2800:            for (y = yv -> yv_idlist; y; y = y -> yv_next) {
        !          2801:                print_value (y, level + 1);
        !          2802:                (void) fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          2803:            }
        !          2804:            break;
        !          2805: 
        !          2806:        default:
        !          2807:            break;
        !          2808:     }
        !          2809: }
        !          2810: 
        !          2811: /*    SYMBOLS */
        !          2812: 
        !          2813: static SY  new_symbol (encpref, decpref, prfpref, mod, id, type)
        !          2814: register char  *encpref,
        !          2815:               *decpref,
        !          2816:               *prfpref,
        !          2817:               *mod,
        !          2818:               *id;
        !          2819: register YP    type;
        !          2820: {
        !          2821:     register SY    sy;
        !          2822: 
        !          2823:     if ((sy = (SY) calloc (1, sizeof *sy)) == NULLSY)
        !          2824:        yyerror ("out of memory");
        !          2825:     sy -> sy_encpref = encpref;
        !          2826:     sy -> sy_decpref = decpref;
        !          2827:     sy -> sy_prfpref = prfpref;
        !          2828:     sy -> sy_module = mod;
        !          2829:     sy -> sy_name = id;
        !          2830:     sy -> sy_type = type;
        !          2831: 
        !          2832:     return sy;
        !          2833: }
        !          2834: 
        !          2835: 
        !          2836: static SY  add_symbol (s1, s2)
        !          2837: register SY    s1,
        !          2838:                s2;
        !          2839: {
        !          2840:     register SY            sy;
        !          2841: 
        !          2842:     if (s1 == NULLSY)
        !          2843:        return s2;
        !          2844: 
        !          2845:     for (sy = s1; sy -> sy_next; sy = sy -> sy_next)
        !          2846:        continue;
        !          2847:     sy -> sy_next = s2;
        !          2848: 
        !          2849:     return s1;
        !          2850: }
        !          2851: 
        !          2852: /*    MODULES */
        !          2853: 
        !          2854: MD  lookup_module (module, oid)
        !          2855: char   *module;
        !          2856: OID    oid;
        !          2857: {
        !          2858:     register MD            md;
        !          2859: 
        !          2860:     for (md = mymodules; md; md = md -> md_next) {
        !          2861:        if (module && md -> md_module && strcmp (md -> md_module, module) == 0)
        !          2862:            return md;
        !          2863:        if (oid && md -> md_oid && oid_cmp(oid, md->md_oid) == 0)
        !          2864:            return md;
        !          2865:     }
        !          2866: 
        !          2867:     read_ph_file (module, oid);
        !          2868: 
        !          2869:     if ((md = (MD) calloc (1, sizeof *md)) == NULLMD)
        !          2870:        yyerror ("out of memory");
        !          2871:     md -> md_module = new_string (module);
        !          2872:     if (oid)
        !          2873:        md -> md_oid = oid_cpy(oid);
        !          2874:     else
        !          2875:        md -> md_oid = NULLOID;
        !          2876: 
        !          2877:     if (mymodules != NULLMD)
        !          2878:        md -> md_next = mymodules;
        !          2879: 
        !          2880:     return (mymodules = md);
        !          2881: }
        !          2882: 
        !          2883: /*    TYPES */
        !          2884: 
        !          2885: YP     new_type (code)
        !          2886: int    code;
        !          2887: {
        !          2888:     register YP    yp;
        !          2889: 
        !          2890:     if ((yp = (YP) calloc (1, sizeof *yp)) == NULLYP)
        !          2891:        yyerror ("out of memory");
        !          2892:     yp -> yp_code = code;
        !          2893: 
        !          2894:     return yp;
        !          2895: }
        !          2896: 
        !          2897: 
        !          2898: YP     add_type (y, z)
        !          2899: register YP    y,
        !          2900:                z;
        !          2901: {
        !          2902:     register YP            yp;
        !          2903: 
        !          2904:     for (yp = y; yp -> yp_next; yp = yp -> yp_next)
        !          2905:        continue;
        !          2906:     yp -> yp_next = z;
        !          2907: 
        !          2908:     return y;
        !          2909: }
        !          2910: 
        !          2911: /*  */
        !          2912: 
        !          2913: YP     copy_type (yp)
        !          2914: register YP    yp;
        !          2915: {
        !          2916:     register YP            y;
        !          2917: 
        !          2918:     if (yp == NULLYP)
        !          2919:        return NULLYP;
        !          2920: 
        !          2921:     y = new_type (yp -> yp_code);
        !          2922:     y -> yp_direction = yp -> yp_direction;
        !          2923: 
        !          2924:     switch (yp -> yp_code) {
        !          2925:        case YP_IDEFINED:
        !          2926:            if (yp -> yp_module)
        !          2927:                y -> yp_module = new_string (yp -> yp_module);
        !          2928:            y -> yp_identifier = new_string (yp -> yp_identifier);
        !          2929:            y -> yp_modid = oid_cpy (yp -> yp_modid);
        !          2930:            break;
        !          2931: 
        !          2932:        case YP_SEQTYPE:
        !          2933:        case YP_SEQLIST:
        !          2934:        case YP_SETTYPE:
        !          2935:        case YP_SETLIST:
        !          2936:        case YP_CHOICE:
        !          2937:            y -> yp_type = copy_type (yp -> yp_type);
        !          2938:            break;
        !          2939: 
        !          2940:        case YP_INTLIST:
        !          2941:        case YP_ENUMLIST:
        !          2942:        case YP_BITLIST:
        !          2943:            y -> yp_value = copy_value (yp -> yp_value);
        !          2944:            break;
        !          2945: 
        !          2946:        default:
        !          2947:            break;
        !          2948:     }
        !          2949: 
        !          2950:     y -> yp_intexp = yp -> yp_intexp;
        !          2951:     y -> yp_strexp = yp -> yp_strexp;
        !          2952:     y -> yp_prfexp = yp -> yp_prfexp;
        !          2953: 
        !          2954:     y -> yp_declexp = yp -> yp_declexp;
        !          2955:     y -> yp_varexp = yp -> yp_varexp;
        !          2956: 
        !          2957:     if (yp -> yp_structname)
        !          2958:        y -> yp_structname = new_string (yp -> yp_structname);
        !          2959:     if (yp -> yp_ptrname)
        !          2960:        y -> yp_ptrname = new_string (yp -> yp_ptrname);
        !          2961: 
        !          2962:     if (yp -> yp_param_type)
        !          2963:        y -> yp_param_type = new_string (yp -> yp_param_type);
        !          2964: 
        !          2965:     if (yp -> yp_action0) {
        !          2966:        y -> yp_action0 = new_string (yp -> yp_action0);
        !          2967:        y -> yp_act0_lineno = yp -> yp_act0_lineno;
        !          2968:     }
        !          2969: 
        !          2970:     if (yp -> yp_action05) {
        !          2971:        y -> yp_action05 = new_string (yp -> yp_action05);
        !          2972:        y -> yp_act05_lineno = yp -> yp_act05_lineno;
        !          2973:     }
        !          2974: 
        !          2975:     if (yp -> yp_action1) {
        !          2976:        y -> yp_action1 = new_string (yp -> yp_action1);
        !          2977:        y -> yp_act1_lineno = yp -> yp_act1_lineno;
        !          2978:     }
        !          2979: 
        !          2980:     if (yp -> yp_action2) {
        !          2981:        y -> yp_action2 = new_string (yp -> yp_action2);
        !          2982:        y -> yp_act2_lineno = yp -> yp_act2_lineno;
        !          2983:     }
        !          2984: 
        !          2985:     if (yp -> yp_action3) {
        !          2986:        y -> yp_action3 = new_string (yp -> yp_action3);
        !          2987:        y -> yp_act3_lineno = yp -> yp_act3_lineno;
        !          2988:     }
        !          2989: 
        !          2990:     y -> yp_flags = yp -> yp_flags;
        !          2991: 
        !          2992:     if (yp -> yp_flags & YP_DEFAULT)
        !          2993:        y -> yp_default = copy_value (yp -> yp_default);
        !          2994: 
        !          2995:     if (yp -> yp_flags & YP_ID)
        !          2996:        y -> yp_id = new_string (yp -> yp_id);
        !          2997: 
        !          2998:     if (yp -> yp_flags & YP_TAG)
        !          2999:        y -> yp_tag = copy_tag (yp -> yp_tag);
        !          3000: 
        !          3001:     if (yp -> yp_flags & YP_BOUND)
        !          3002:        y -> yp_bound = new_string (yp -> yp_bound);
        !          3003: 
        !          3004:     if (yp -> yp_flags & YP_PARMVAL)
        !          3005:        y -> yp_parm = new_string (yp -> yp_parm);
        !          3006: 
        !          3007:     if (yp -> yp_flags & YP_CONTROLLED)
        !          3008:         y -> yp_control = new_string (yp -> yp_control);
        !          3009: 
        !          3010:     if (yp -> yp_flags & YP_OPTCONTROL)
        !          3011:         y -> yp_optcontrol = new_string (yp -> yp_optcontrol);
        !          3012: 
        !          3013:     if (yp -> yp_offset)
        !          3014:        y -> yp_offset = new_string (yp -> yp_offset);
        !          3015: 
        !          3016:     if (yp -> yp_next)
        !          3017:        y -> yp_next = copy_type (yp -> yp_next);
        !          3018: 
        !          3019:     return y;
        !          3020: }
        !          3021: 
        !          3022: /*    VALUES */
        !          3023: 
        !          3024: YV     new_value (code)
        !          3025: int    code;
        !          3026: {
        !          3027:     register YV    yv;
        !          3028: 
        !          3029:     if ((yv = (YV) calloc (1, sizeof *yv)) == NULLYV)
        !          3030:        yyerror ("out of memory");
        !          3031:     yv -> yv_code = code;
        !          3032: 
        !          3033:     return yv;
        !          3034: }
        !          3035: 
        !          3036: 
        !          3037: YV     add_value (y, z)
        !          3038: register YV    y,
        !          3039:                z;
        !          3040: {
        !          3041:     register YV            yv;
        !          3042: 
        !          3043:     for (yv = y; yv -> yv_next; yv = yv -> yv_next)
        !          3044:        continue;
        !          3045:     yv -> yv_next = z;
        !          3046: 
        !          3047:     return y;
        !          3048: }
        !          3049: 
        !          3050: /*  */
        !          3051: 
        !          3052: YV     copy_value (yv)
        !          3053: register YV    yv;
        !          3054: {
        !          3055:     register YV            y;
        !          3056: 
        !          3057:     if (yv == NULLYV)
        !          3058:        return NULLYV;
        !          3059: 
        !          3060:     y = new_value (yv -> yv_code);
        !          3061:     y -> yv_flags = yv -> yv_flags;
        !          3062: 
        !          3063:     if (yv -> yv_action) {
        !          3064:        y -> yv_action = new_string (yv -> yv_action);
        !          3065:        y -> yv_act_lineno = yv -> yv_act_lineno;
        !          3066:     }
        !          3067: 
        !          3068:     if (yv -> yv_flags & YV_ID)
        !          3069:        y -> yv_id = new_string (yv -> yv_id);
        !          3070: 
        !          3071:     if (yv -> yv_flags & YV_NAMED)
        !          3072:        y -> yv_named = new_string (yv -> yv_named);
        !          3073: 
        !          3074:     if (yv -> yv_flags & YV_TYPE)
        !          3075:        y -> yv_type = copy_type (yv -> yv_type);
        !          3076: 
        !          3077:     switch (yv -> yv_code) {
        !          3078:        case YV_NUMBER:
        !          3079:        case YV_BOOL:
        !          3080:            y -> yv_number = yv -> yv_number;
        !          3081:            break;
        !          3082: 
        !          3083:        case YV_STRING:
        !          3084:            y -> yv_string = new_string (yv -> yv_string);
        !          3085:            break;
        !          3086: 
        !          3087:        case YV_IDEFINED:
        !          3088:            if (yv -> yv_module)
        !          3089:                y -> yv_module = new_string (yv -> yv_module);
        !          3090:            y -> yv_identifier = new_string (yv -> yv_identifier);
        !          3091:            break;
        !          3092: 
        !          3093:        case YV_IDLIST:
        !          3094:        case YV_VALIST:
        !          3095:            y -> yv_idlist = copy_value (yv -> yv_idlist);
        !          3096:            break;
        !          3097: 
        !          3098:        default:
        !          3099:            break;
        !          3100:     }
        !          3101: 
        !          3102:     if (yv -> yv_next)
        !          3103:        y -> yv_next = copy_value (yv -> yv_next);
        !          3104: 
        !          3105:     return y;
        !          3106: }
        !          3107: 
        !          3108: /*    TAGS */
        !          3109: 
        !          3110: YT     new_tag (class)
        !          3111: PElementClass  class;
        !          3112: {
        !          3113:     register YT    yt;
        !          3114: 
        !          3115:     if ((yt = (YT) calloc (1, sizeof *yt)) == NULLYT)
        !          3116:        yyerror ("out of memory");
        !          3117:     yt -> yt_class = class;
        !          3118: 
        !          3119:     return yt;
        !          3120: }
        !          3121: 
        !          3122: /*  */
        !          3123: 
        !          3124: YT     copy_tag (yt)
        !          3125: register YT    yt;
        !          3126: {
        !          3127:     register YT            y;
        !          3128: 
        !          3129:     if (yt == NULLYT)
        !          3130:        return NULLYT;
        !          3131: 
        !          3132:     y = new_tag (yt -> yt_class);
        !          3133: 
        !          3134:     y -> yt_value = copy_value (yt -> yt_value);
        !          3135: 
        !          3136:     return y;
        !          3137: }
        !          3138: 
        !          3139: /*    STRINGS */
        !          3140: 
        !          3141: char   *new_string (s)
        !          3142: register char  *s;
        !          3143: {
        !          3144:     register char  *p;
        !          3145: 
        !          3146:     if ((p = malloc ((unsigned) (strlen (s) + 1))) == NULLCP)
        !          3147:        yyerror ("out of memory");
        !          3148: 
        !          3149:     (void) strcpy (p, s);
        !          3150:     return p;
        !          3151: }
        !          3152: 
        !          3153: /*    SYMBOLS */
        !          3154: 
        !          3155: static struct triple {
        !          3156:     char          *t_name;
        !          3157:     PElementClass   t_class;
        !          3158:     PElementID     t_id;
        !          3159: }              triples[] = {
        !          3160:     "IA5String", PE_CLASS_UNIV,        PE_DEFN_IA5S,
        !          3161:     "ISO646String", PE_CLASS_UNIV, PE_DEFN_IA5S,
        !          3162:     "NumericString", PE_CLASS_UNIV, PE_DEFN_NUMS,
        !          3163:     "PrintableString", PE_CLASS_UNIV, PE_DEFN_PRTS,
        !          3164:     "T61String", PE_CLASS_UNIV, PE_DEFN_T61S,
        !          3165:     "TeletexString", PE_CLASS_UNIV, PE_DEFN_T61S,
        !          3166:     "VideotexString", PE_CLASS_UNIV, PE_DEFN_VTXS,
        !          3167:     "GeneralizedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
        !          3168:     "GeneralisedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
        !          3169:     "UTCTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
        !          3170:     "UniversalTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
        !          3171:     "GraphicString", PE_CLASS_UNIV, PE_DEFN_GFXS,
        !          3172:     "VisibleString", PE_CLASS_UNIV, PE_DEFN_VISS,
        !          3173:     "GeneralString", PE_CLASS_UNIV, PE_DEFN_GENS,
        !          3174:     "EXTERNAL", PE_CLASS_UNIV, PE_CONS_EXTN,
        !          3175:     "ObjectDescriptor", PE_CLASS_UNIV, PE_PRIM_ODE,
        !          3176: 
        !          3177:     NULL
        !          3178: };
        !          3179: 
        !          3180: /*  */
        !          3181: 
        !          3182: char *modsym (module, id, prefix)
        !          3183: register char  *module,
        !          3184:               *id;
        !          3185: char   *prefix;
        !          3186: {
        !          3187:     char    buf1[BUFSIZ],
        !          3188:             buf2[BUFSIZ],
        !          3189:             buf3[BUFSIZ];
        !          3190:     register struct triple *t;
        !          3191:     static char buffer[BUFSIZ];
        !          3192: 
        !          3193:     if (module == NULLCP)
        !          3194:        for (t = triples; t -> t_name; t++)
        !          3195:            if (strcmp (t -> t_name, id) == 0) {
        !          3196:                module = "UNIV";
        !          3197:                break;
        !          3198:            }
        !          3199: 
        !          3200:     if (prefix)
        !          3201:        modsym_aux (prefix, buf1);
        !          3202:     modsym_aux (module ? module : mymodule, buf2);
        !          3203:     modsym_aux (id, buf3);
        !          3204:     if (prefix)
        !          3205:        (void) sprintf (buffer, "%s_%s_%s", buf1, buf2, buf3);
        !          3206:     else
        !          3207:        (void) sprintf (buffer, "%s_%s", buf2, buf3);
        !          3208: 
        !          3209:     return buffer;
        !          3210: }
        !          3211: 
        !          3212: 
        !          3213: static modsym_aux (name, bp)
        !          3214: register char  *name,
        !          3215:               *bp;
        !          3216: {
        !          3217:     register char   c;
        !          3218: 
        !          3219:     while (c = *name++)
        !          3220:        switch (c) {
        !          3221:            case '-':
        !          3222:                *bp++ = '_';
        !          3223:                *bp++ = '_';
        !          3224:                break;
        !          3225: 
        !          3226:            default:
        !          3227:                *bp++ = c;
        !          3228:                break;
        !          3229:        }
        !          3230: 
        !          3231:     *bp = NULL;
        !          3232: }
        !          3233: 
        !          3234: /*  */
        !          3235: 
        !          3236: static char *gensym (s, a)
        !          3237: char   *s, *a;
        !          3238: {
        !          3239:     int     i;
        !          3240:     register char  *p;
        !          3241:     char    buffer[BUFSIZ];
        !          3242:     static int  cP = 0;
        !          3243:     static int  eP = 0;
        !          3244:     static int  mP = 0;
        !          3245: 
        !          3246:     switch (*s) {
        !          3247:        case 'c': 
        !          3248:            i = cP++;
        !          3249:            break;
        !          3250:        case 'e': 
        !          3251:            i = eP++;
        !          3252:            break;
        !          3253:        case 'm': 
        !          3254:            i = mP++;
        !          3255:            break;
        !          3256: 
        !          3257:        default: 
        !          3258:            myyerror ("unknown gensym argument \"%s\"", s);
        !          3259:        /* NOTREACHED */
        !          3260:     }
        !          3261:     if (a)
        !          3262:        (void) sprintf (buffer, "%s_%s_%d[n_%s]", s, modulename, i, a);
        !          3263:     else
        !          3264:        (void) sprintf (buffer, "%s_%s_%d", s, modulename, i);
        !          3265: 
        !          3266:     if ((p = malloc ((unsigned) (strlen (buffer) + 11))) == NULLCP)
        !          3267:        yyerror ("out of memory");
        !          3268: 
        !          3269:     (void) strcpy (p, buffer);
        !          3270:     return p;
        !          3271: }
        !          3272: 
        !          3273: /* pepy compatible routines - you know how it is ... */
        !          3274: init_new_file () 
        !          3275: {
        !          3276:     ;
        !          3277: }
        !          3278: 
        !          3279: end_file ()
        !          3280: {
        !          3281:     ;
        !          3282: }
        !          3283: 
        !          3284: static char *array (s, flg)
        !          3285: char   *s;
        !          3286: int    flg;
        !          3287: {
        !          3288:     static char buf[BUFSIZ];
        !          3289:     char       *p;
        !          3290: 
        !          3291:     if (!flg) return s;
        !          3292: 
        !          3293:     if (p = index (s, '[')) {
        !          3294:        (void) sprintf (buf, "%*.*s[1]", p - s, p - s, s);
        !          3295:        return buf;
        !          3296:     }
        !          3297:     return s;
        !          3298: }
        !          3299: 
        !          3300: static void prime_default (yp, level)
        !          3301: YP     yp;
        !          3302: int    level;
        !          3303: {
        !          3304:     switch (yp -> yp_code) {
        !          3305:     case YP_BOOL:
        !          3306:        (void) printf ("%*s%s = %d;\n", level * 4, "",
        !          3307:                SVAL (yp->yp_varexp),
        !          3308:                val2int (yp -> yp_default) ? 1 : 0);
        !          3309:        break;
        !          3310: 
        !          3311:     case YP_INT:
        !          3312:        (void) printf ("%*s%s = %d;\n", level * 4, "",
        !          3313:                SVAL (yp -> yp_varexp), val2int (yp -> yp_default));
        !          3314:        break;
        !          3315: 
        !          3316:     case YP_INTLIST:
        !          3317:     case YP_ENUMLIST:
        !          3318:        (void) printf ("%*s%s = %d;\n", level * 4, "",
        !          3319:                SVAL (yp -> yp_varexp), dfl2int (yp));
        !          3320:        break;
        !          3321: 
        !          3322:     case YP_REAL:
        !          3323:        (void) printf ("%*s%s = %g;\n", level * 4, "",
        !          3324:                SVAL (yp -> yp_varexp),
        !          3325:                val2real (yp -> yp_default));
        !          3326: 
        !          3327:     default:
        !          3328:        break;
        !          3329:     }
        !          3330: }
        !          3331: /* PH FILES */
        !          3332: 
        !          3333: /* really need much more information in the .ph file... */
        !          3334: 
        !          3335: static read_ph_file (module, oid)
        !          3336: register char *module;
        !          3337: OID    oid;
        !          3338: {
        !          3339:     int     class,
        !          3340:            value,
        !          3341:            direction;
        !          3342:     char    buffer[BUFSIZ],
        !          3343:            file[BUFSIZ],
        !          3344:            id[BUFSIZ],
        !          3345:            encpref[BUFSIZ],
        !          3346:            decpref[BUFSIZ],
        !          3347:            printpref[BUFSIZ];
        !          3348:     char    *p, *ep, *dp, *ppp;
        !          3349:     register FILE  *fp;
        !          3350:     register YP            yp;
        !          3351:     register YT            yt;
        !          3352:     register YV            yv;
        !          3353: 
        !          3354:     (void) sprintf (file, "%s.ph", module);
        !          3355:     if (oid)
        !          3356:        (void) sprintf (p = buffer, "%s.ph", sprintoid(oid));
        !          3357:     else
        !          3358:        p = NULLCP;
        !          3359:     if ((fp = open_ph_file (file, p, "r")) == NULL)
        !          3360:     {
        !          3361:        warning ("Can't find file %s%s%s failed\n",
        !          3362:                     file, p ? "/" : "", p ? p : "");
        !          3363:        return;
        !          3364:     }
        !          3365: 
        !          3366:     if (strcmp (module, "UNIV"))
        !          3367:        yyprint (module, 1, 0);
        !          3368: 
        !          3369:     while (fgets (buffer, sizeof buffer, fp)) {
        !          3370:        if (sscanf (buffer, "%d/%d/%d: %s",
        !          3371:                    &class, &value, &direction, id) !=4) {
        !          3372:            myyerror ("bad external definition in %s: %s",
        !          3373:                    file, buffer);
        !          3374:            continue;
        !          3375:        }
        !          3376:        ppp = dp = ep = NULLCP;
        !          3377:        if (p = index(buffer, '|')) {
        !          3378:            if( sscanf (p+1, "%s %s %s\n", encpref, decpref, printpref) == 3) {
        !          3379:                ppp = new_string (printpref);
        !          3380:                dp = new_string (decpref);
        !          3381:                ep = new_string (encpref);
        !          3382:            }
        !          3383:        }
        !          3384:                
        !          3385:        yp = new_type (YP_ANY);
        !          3386:        yp -> yp_flags = YP_IMPORTED;
        !          3387:        if (class >= 0) {
        !          3388:            yp -> yp_flags |= YP_TAG;
        !          3389:            yp -> yp_tag = yt = new_tag ((PElementClass) class);
        !          3390:            yt -> yt_value = yv = new_value (YV_NUMBER);
        !          3391:            yv -> yv_number = value;
        !          3392:        }
        !          3393:        yp -> yp_direction = direction;
        !          3394:        pass1_type (ep, dp, ppp, new_string (module),
        !          3395:                new_string (id), yp);
        !          3396:     }
        !          3397: 
        !          3398:     (void) fclose (fp);
        !          3399: }
        !          3400: 
        !          3401: /*  */
        !          3402: 
        !          3403: static write_ph_file () {
        !          3404:     int            msave;
        !          3405:     char    file[BUFSIZ];
        !          3406:     char    fileoid[BUFSIZ];
        !          3407:     char       *cp;
        !          3408:     register FILE  *fp;
        !          3409:     register SY            sy;
        !          3410:     register YT            yt;
        !          3411:     register YP            yp;
        !          3412: 
        !          3413:     (void) sprintf (file, "%s.ph", mymodule);
        !          3414:     if (mymoduleid)
        !          3415:        (void) sprintf (cp = fileoid, "%s.ph", sprintoid(mymoduleid));
        !          3416:     else
        !          3417:        cp = NULLCP;
        !          3418:     msave = mflag, mflag = 0;
        !          3419:     if ((fp = open_ph_file (file, cp, "w")) == NULL)
        !          3420:        myyerror ("unable to write %s", file);
        !          3421:     mflag = msave;
        !          3422: 
        !          3423:     for (sy = mysymbols; sy; sy = sy -> sy_next) {
        !          3424:        yp = sy -> sy_type;
        !          3425:        if (yp -> yp_flags & YP_IMPORTED)
        !          3426:            continue;
        !          3427:        if (doexternals == 0 && (yp->yp_flags & YP_EXPORTED) == 0)
        !          3428:            continue;
        !          3429: 
        !          3430:        if (is_any_type (yp)) {
        !          3431:            (void) fprintf (fp, "-1/0/%d: %s", yp -> yp_direction, sy -> sy_name);
        !          3432:            (void) fprintf (fp, " |%s %s %s\n", yyencpref, yydecpref, yyprfpref);
        !          3433:        }
        !          3434:        else
        !          3435:            if ((yt = lookup_tag (yp)) && yt -> yt_class != PE_CLASS_CONT) {
        !          3436:                (void) fprintf (fp, "%d/%d/%d: %s", yt -> yt_class,
        !          3437:                            val2int (yt -> yt_value), yp -> yp_direction,
        !          3438:                            sy -> sy_name);
        !          3439:                (void) fprintf (fp, " |%s %s %s\n", yyencpref, yydecpref, yyprfpref);
        !          3440:            }
        !          3441:     }
        !          3442: 
        !          3443:     (void) fclose (fp);
        !          3444: }
        !          3445: 
        !          3446: /*  */
        !          3447: 
        !          3448: #ifndef        PEPSYPATH
        !          3449: #define        PEPSYPATH       ""
        !          3450: #endif
        !          3451: 
        !          3452: 
        !          3453: static FILE *open_ph_file (fn, fnoid, mode)
        !          3454: char *fn,
        !          3455:      *fnoid,
        !          3456:      *mode;
        !          3457: {
        !          3458:     register char  *dst,
        !          3459:                   *path;
        !          3460:     char    fnb[BUFSIZ];
        !          3461:     register FILE  *fp;
        !          3462:     static char *pepypath = NULL;
        !          3463: 
        !          3464:     if (*fn == '/')
        !          3465:        return fopen (fn, mode);
        !          3466: 
        !          3467:     if (mflag) {       /* MOBY HACK */
        !          3468:        if (fnoid && (fp = fopen (fnoid, mode)) != NULL)
        !          3469:            return fp;
        !          3470:        if ((fp = fopen (fn, mode)) != NULL)
        !          3471:            return fp;
        !          3472: 
        !          3473:        if (fnoid) {
        !          3474:            (void) sprintf (fnb, "../pepy/%s", fnoid);
        !          3475:            if ((fp = fopen (fnb, mode)) != NULL)
        !          3476:                return fp;
        !          3477:        }
        !          3478:        (void) sprintf (fnb, "../pepy/%s", fn);
        !          3479:        if ((fp = fopen (fnb, mode)) != NULL)
        !          3480:            return fp;
        !          3481: 
        !          3482:        if (fnoid) {
        !          3483:            (void) sprintf (fnb, "../../pepy/%s", fnoid);
        !          3484:            if ((fp = fopen (fnb, mode)) != NULL)
        !          3485:                return fp;
        !          3486:        }
        !          3487:        (void) sprintf (fnb, "../../pepy/%s", fn);
        !          3488:        return fopen (fnb, mode);
        !          3489:     }
        !          3490: 
        !          3491:     if (pepypath == NULL && (pepypath = getenv ("PEPSYPATH")) == NULL)
        !          3492:        pepypath = PEPSYPATH;
        !          3493:     path = pepypath;
        !          3494: 
        !          3495:     do {
        !          3496:        dst = fnb;
        !          3497:        while (*path && *path != ':')
        !          3498:            *dst++ = *path++;
        !          3499:        if (dst != fnb)
        !          3500:            *dst++ = '/';
        !          3501:        if (fnoid) {
        !          3502:            (void) strcpy (dst, fnoid);
        !          3503:            if ((fp = fopen (fnb, mode)) != NULL)
        !          3504:                break;
        !          3505:        }
        !          3506:        (void) strcpy (dst, fn);
        !          3507:        if ((fp = fopen (fnb, mode)) != NULL)
        !          3508:            break;
        !          3509:     } while (*path++);
        !          3510: 
        !          3511:     return fp;
        !          3512: }
        !          3513: 
        !          3514: YT  lookup_tag (yp)
        !          3515: register YP     yp;
        !          3516: {
        !          3517:     register struct tuple *t;
        !          3518:     static struct ypt ypts;
        !          3519:     register YT     yt = &ypts;
        !          3520:     static struct ypv ypvs;
        !          3521:     register YV     yv = &ypvs;
        !          3522:     register YP     z;
        !          3523: 
        !          3524:     if (yp -> yp_flags & YP_TAG)
        !          3525:         return yp -> yp_tag;
        !          3526: 
        !          3527:     while (yp -> yp_code == YP_IDEFINED) {
        !          3528:         if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
        !          3529:             (void) lookup_module (yp -> yp_module, yp -> yp_modid);
        !          3530:  
        !          3531:         if (z = lookup_type (yp -> yp_module, yp -> yp_identifier)) {
        !          3532:             yp = z;
        !          3533:  
        !          3534:             if (yp -> yp_flags & YP_TAG)
        !          3535:                 return yp -> yp_tag;
        !          3536:  
        !          3537:             continue;
        !          3538:         }
        !          3539:  
        !          3540:         break;
        !          3541:     }
        !          3542:  
        !          3543:     for (t = tuples; t -> t_type != YP_UNDF; t++)
        !          3544:         if (t -> t_type == yp -> yp_code) {
        !          3545:             yt -> yt_class = t -> t_classnum;
        !          3546:             yt -> yt_value = yv;
        !          3547:             yv -> yv_code = YV_NUMBER;
        !          3548:             yv -> yv_number = t -> t_idnum;
        !          3549:  
        !          3550:             return yt;
        !          3551:         }
        !          3552:  
        !          3553:     return NULLYT;
        !          3554: }
        !          3555:  
        !          3556: int  is_any_type (yp)
        !          3557: register YP     yp;
        !          3558: {
        !          3559:     register    YP z;
        !          3560: 
        !          3561:     while (yp -> yp_code == YP_IDEFINED) {
        !          3562:         if (yp -> yp_flags & YP_TAG)
        !          3563:             return 0;
        !          3564: 
        !          3565:         if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
        !          3566:             (void) lookup_module (yp -> yp_module, yp -> yp_modid);
        !          3567: 
        !          3568:         if (z = lookup_type (yp -> yp_module, yp -> yp_identifier)) {
        !          3569:             yp = z;
        !          3570: 
        !          3571:             continue;
        !          3572:         }
        !          3573:  
        !          3574:         break;
        !          3575:     }
        !          3576:  
        !          3577:     return (yp -> yp_code == YP_ANY && !(yp -> yp_flags & YP_TAG));
        !          3578: }
        !          3579: 
        !          3580: /*
        !          3581:  * return a string with the leading pathname stripped off
        !          3582:  */
        !          3583: char *
        !          3584: pstrip(p)
        !          3585: char *p;
        !          3586: {
        !          3587:     char *p1;
        !          3588: 
        !          3589:     if (p1 = rindex(p, '/'))
        !          3590:        return (p1 + 1);
        !          3591:     return (p);
        !          3592: }
        !          3593: 
        !          3594:  
        !          3595: /*
        !          3596:  * produce a #include on the given file descriptor according to what ever
        !          3597:  * rules are in fashion today. Unfortunately these keep changing so to
        !          3598:  * minimise the effort involved in keeping up we put all the code to change
        !          3599:  * in the one place, here. -- amrw
        !          3600:  *
        !          3601:  * actually, the rules have never changed, andrew just can't figure them out.
        !          3602:  *     -- mtr
        !          3603:  */
        !          3604: doincl(fp, file)
        !          3605: FILE   *fp;            /* where #include is to be written to */
        !          3606: char   *file[];        /* files to be included */
        !          3607: {
        !          3608:     char       **p;
        !          3609:     int                stflag = 0;             /* are there any standard files ? */
        !          3610: 
        !          3611:     /* determine if there are any standard files present */
        !          3612:     for (p = file; *p; p++) {
        !          3613:        if (is_stand(*p)) {
        !          3614:            stflag = 1;
        !          3615:            break;
        !          3616:        }
        !          3617:     }
        !          3618: 
        !          3619:     if (mflag || stflag) {
        !          3620:        /* PEPYPATH version */
        !          3621: 
        !          3622:        (void) fprintf (fp, "#ifndef    PEPYPATH\n");
        !          3623:        for (p = file; *p; p++) {
        !          3624:            if (mflag || is_stand(*p))
        !          3625:                (void) fprintf (fp, "#include <isode/%s>\n", *p);
        !          3626:        }
        !          3627:        (void) fprintf (fp, "#else\n");
        !          3628:        for (p = file; *p; p++) {
        !          3629:            if (mflag || is_stand(*p))
        !          3630:                (void) fprintf (fp, "#include \"%s\"\n", pstrip(*p));
        !          3631:        }
        !          3632:        (void) fprintf (fp, "#endif\n\n");
        !          3633: 
        !          3634:        /* Now the non standard files */
        !          3635:        if (!mflag) {
        !          3636:            for (p = file; *p; p++) {
        !          3637:                if (!is_stand(*p))
        !          3638:                    (void) fprintf (fp, "#include \"%s\"\n", pstrip(*p));
        !          3639:            }
        !          3640:        }
        !          3641: 
        !          3642:     } else {
        !          3643:        /* simple include only version */
        !          3644: 
        !          3645:        for (p = file; *p; p++)
        !          3646:            (void) fprintf (fp, "#include \"%s\"\n", pstrip(*p));
        !          3647:     }
        !          3648: 
        !          3649:     (void) fprintf (fp, "\n");
        !          3650: }
        !          3651: 
        !          3652: /* standard files  - that should be found in the <isode> directory */
        !          3653: static char *stand_f[] = {
        !          3654:        "psap.h",
        !          3655:        "pepsy.h",
        !          3656:        "UNIV-types.h",
        !          3657: 
        !          3658:        (char *)0       /* terminating NULL pointer */
        !          3659:        };
        !          3660: 
        !          3661: 
        !          3662: /*
        !          3663:  * determine if the given (after stripping any path) file is a standard
        !          3664:  * include file which should be in the include/isode directory.
        !          3665:  * return nonzero (true) if it is.
        !          3666:  */
        !          3667: is_stand(file)
        !          3668: char *file;
        !          3669: {
        !          3670:     char       **p;
        !          3671: 
        !          3672:     for (p = stand_f; *p; p++) {
        !          3673:        if (strcmp(file, pstrip(*p)) == 0)
        !          3674:            return (1);
        !          3675:     }
        !          3676: 
        !          3677:     return (0);
        !          3678: }
        !          3679: 
        !          3680: /* Number of different external modules that can referenced */
        !          3681: #define EXTMODSIZE     50
        !          3682: 
        !          3683: /* table of external modules we reference */
        !          3684: static char *extmodtab[EXTMODSIZE];
        !          3685: static int   nextmod = 0;      /* next free slot in external module table */
        !          3686: 
        !          3687: /*
        !          3688:  * build up a list of external modules we have referenced
        !          3689:  */
        !          3690: addextmod(p)
        !          3691: char   *p;     /* name of external module */
        !          3692: {
        !          3693: #if 0
        !          3694:     char *s;
        !          3695: #endif
        !          3696: 
        !          3697:     if (nextmod >= EXTMODSIZE)
        !          3698:        ferr(1, "Too many external modules reference, table overflow\n");
        !          3699: 
        !          3700: #if 0
        !          3701:     if ((s = (char *)malloc(strlen(p) + 1)) == NULL)
        !          3702:        ferr(1, "addextmodout of memory\n");
        !          3703:     strcpy(s, p);
        !          3704:     extmodtab[nextmod++] = s;
        !          3705: #else
        !          3706:     extmodtab[nextmod++] = p;
        !          3707: #endif
        !          3708: }
        !          3709: 
        !          3710: /*
        !          3711:  * process all the external modules collected to produce the includes
        !          3712:  * required
        !          3713:  */
        !          3714: proc_extmod(fp)
        !          3715: FILE   *fp;
        !          3716: {
        !          3717:     char       **p;
        !          3718:     char       *files[EXTMODSIZE + 1];
        !          3719:     char       *buf;
        !          3720:     char       *tail = "-types.h";
        !          3721:     char       *prefix = "pepsy/";
        !          3722:     int                last = 0;
        !          3723: 
        !          3724:     if (nextmod <= 0)
        !          3725:        return;         /* no external definitions */
        !          3726: 
        !          3727:     for (p = extmodtab; p < extmodtab + nextmod; p++) {
        !          3728:        if (last >= EXTMODSIZE)
        !          3729:            ferr(1, "proc_extmod: too many external modules\n");
        !          3730: 
        !          3731:        buf = concat(*p, tail);
        !          3732:        if (mflag || is_stand(buf)) /* need to prepend a "pepsy/" */
        !          3733:            files[last++] = my_strcat(prefix, buf);
        !          3734:        else
        !          3735:            files[last++] = my_new_str(buf);
        !          3736:     }
        !          3737:     files[last++] = (char *)0;
        !          3738: 
        !          3739:     doincl(fp, files);
        !          3740: 
        !          3741:     /* free up this memory */
        !          3742:     --last; /* don't free the NULL pointer - can core dump */
        !          3743:     while (last > 0)
        !          3744:        free(files[--last]);
        !          3745: 
        !          3746: }
        !          3747:            

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.