Annotation of 43BSDReno/contrib/isode-beta/pepy/posy.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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