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

1.1     ! root        1: /* rosy.c - RO stub-generator (yacc-based) */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/rosy/RCS/rosy.c,v 7.3 90/07/01 21:06:20 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/rosy/RCS/rosy.c,v 7.3 90/07/01 21:06:20 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       rosy.c,v $
        !            12:  * Revision 7.3  90/07/01  21:06:20  mrose
        !            13:  * pepsy
        !            14:  * 
        !            15:  * Revision 7.2  90/01/27  10:27:17  mrose
        !            16:  * touch-up
        !            17:  * 
        !            18:  * Revision 7.1  90/01/11  18:37:50  mrose
        !            19:  * real-sync
        !            20:  * 
        !            21:  * Revision 7.0  89/11/23  22:21:50  mrose
        !            22:  * Release 6.0
        !            23:  * 
        !            24:  */
        !            25: 
        !            26: /*
        !            27:  *                               NOTICE
        !            28:  *
        !            29:  *    Acquisition, use, and distribution of this module and related
        !            30:  *    materials are subject to the restrictions of a license agreement.
        !            31:  *    Consult the Preface in the User's Manual for the full terms of
        !            32:  *    this agreement.
        !            33:  *
        !            34:  */
        !            35: 
        !            36: 
        !            37: #include <ctype.h>
        !            38: #include <stdio.h>
        !            39: #include <varargs.h>
        !            40: #define pepyversion rosyversion
        !            41: #include "rosy-defs.h"
        !            42: #include "../pepsy/pass2.h"
        !            43: 
        !            44: /*    DATA */
        !            45: 
        !            46: int    Cflag = 0;              /* rosy */
        !            47: int    dflag = 0;
        !            48: int     Pflag = 0;             /* pepy compat... */
        !            49: int    Pepsyflag = 0;          /* Pepsy compatability */
        !            50: int    Defsflag = 0;           /* Produce #define function names for Pepsy */
        !            51: int    doexternals;
        !            52: static int linepos = 0;
        !            53: static int mflag = 0;
        !            54: static int rosydebug = 0;
        !            55: char   *bflag = NULLCP;
        !            56: static int sflag = 0;
        !            57: 
        !            58: static  char *eval = NULLCP;
        !            59: 
        !            60: char   *mymodule = "";
        !            61: static char   *mymodulename = NULL;
        !            62: static char    mymodaux[BUFSIZ];
        !            63: static char    oplistorig[BUFSIZ];
        !            64: #define NOPS 128
        !            65: static char *opvp[NOPS];
        !            66: static int opvc;
        !            67: OID    mymoduleid;
        !            68: 
        !            69: int yysection = NULL;
        !            70: char *yyencpref = "none";
        !            71: char *yydecpref = "none";
        !            72: char *yyprfpref = "none";
        !            73: char *yyencdflt = "none";
        !            74: char *yydecdflt = "none";
        !            75: char *yyprfdflt = "none";
        !            76: 
        !            77: static char *yymode = "";
        !            78: 
        !            79: static char *classes[] = {
        !            80:     "UNIVERSAL ",
        !            81:     "APPLICATION ",
        !            82:     "",
        !            83:     "PRIVATE "
        !            84: };
        !            85: 
        !            86: static char autogen[BUFSIZ];
        !            87: 
        !            88: char *sysin = NULLCP;
        !            89: static char sysout[BUFSIZ];
        !            90: static char sysdef[BUFSIZ];
        !            91: static char systbl[BUFSIZ];
        !            92: static char systub[BUFSIZ];
        !            93: 
        !            94: static FILE *fdef;
        !            95: static FILE *ftbl;
        !            96: static FILE *fstb;
        !            97: 
        !            98: typedef struct symlist {
        !            99:     char   *sy_encpref;
        !           100:     char   *sy_decpref;
        !           101:     char   *sy_prfpref;
        !           102:     char   *sy_module;
        !           103:     char   *sy_name;
        !           104: 
        !           105:     union {
        !           106:        YO      sy_un_op;
        !           107: 
        !           108:        YE      sy_un_err;
        !           109: 
        !           110:        YP      sy_un_type;
        !           111:     }  sy_un;
        !           112: #define        sy_op   sy_un.sy_un_op
        !           113: #define        sy_err  sy_un.sy_un_err
        !           114: #define        sy_type sy_un.sy_un_type
        !           115: 
        !           116:     struct symlist *sy_next;
        !           117: }              symlist, *SY;
        !           118: #define        NULLSY  ((SY) 0)
        !           119: 
        !           120: static SY      myoperations = NULLSY;
        !           121: 
        !           122: static int      erroff = 0;
        !           123: static SY      myerrors = NULLSY;
        !           124: 
        !           125: static SY      mytypes = NULLSY;
        !           126: 
        !           127: 
        !           128: char   *modsym ();
        !           129: char   *cmodsym ();
        !           130: char   *csymmod ();
        !           131: SY     new_symbol (), add_symbol ();
        !           132: 
        !           133: YE     lookup_err ();
        !           134: YP     lookup_type ();
        !           135: 
        !           136: /*    MAIN */
        !           137: 
        !           138: /* ARGSUSED */
        !           139: 
        !           140: main (argc, argv, envp)
        !           141: int    argc;
        !           142: char  **argv,
        !           143:       **envp;
        !           144: {
        !           145:     register char  *cp,
        !           146:                   *sp;
        !           147: 
        !           148:     fprintf (stderr, "%s\n", rosyversion);
        !           149: 
        !           150:     sysout[0] = sysdef[0] = systbl[0] = systub[0] = NULL;
        !           151:     for (argc--, argv++; argc > 0; argc--, argv++) {
        !           152:        cp = *argv;
        !           153: 
        !           154:        if (strcmp (cp, "-pepsy") == 0) {
        !           155:                    Pepsyflag++;
        !           156:            continue;
        !           157:        }
        !           158:        if (strcmp (cp, "-defs") == 0) {
        !           159:            Defsflag++;
        !           160:            continue;
        !           161:        }
        !           162:        if (strcmp (cp, "-d") == 0) {
        !           163:            dflag++;
        !           164:            continue;
        !           165:        }
        !           166:        if (strcmp (cp, "-m") == 0) {
        !           167:            mflag++;
        !           168:            continue;
        !           169:        }
        !           170:        if (strcmp (cp, "-o") == 0) {
        !           171:            if (sysout[0]) {
        !           172:                fprintf (stderr, "too many output files\n");
        !           173:                exit (1);
        !           174:            }
        !           175:            argc--, argv++;
        !           176:            if ((cp = *argv) == NULL || (*cp == '-' && cp[1] != NULL))
        !           177:                goto usage;
        !           178:            (void) strcpy (sysout, cp);
        !           179: 
        !           180:            continue;
        !           181:        }
        !           182:        if (strcmp (cp, "-b") == 0) {
        !           183:            if (bflag) {
        !           184:                fprintf (stderr, "too many prefixes\n");
        !           185:                exit (1);
        !           186:            }
        !           187:            argc--, argv++;
        !           188:            if ((bflag = *argv) == NULL || *bflag == '-')
        !           189:                goto usage;
        !           190:            continue;
        !           191:        }
        !           192:        if (strcmp (cp, "-s") == 0) {
        !           193:            sflag++;
        !           194:            continue;
        !           195:        }
        !           196:        if (strcmp (cp, "-T") == 0) {
        !           197:            if (mymodulename) {
        !           198:                fprintf (stderr, "too many table names\n");
        !           199:                exit (1);
        !           200:            }
        !           201:            argc --; argv ++;
        !           202:            if ((mymodulename = *argv) == NULL || *mymodulename == '-')
        !           203:                goto usage;
        !           204:            continue;
        !           205:        }
        !           206:        if (strcmp (cp, "-O") == 0) {
        !           207:            argc --; argv ++;
        !           208:            if ((cp = *argv) == NULL || (*cp == '-'))
        !           209:                goto usage;
        !           210:            if (oplistorig[0])
        !           211:                (void) strcat (oplistorig, cp);
        !           212:            else
        !           213:                (void) strcpy (oplistorig, cp);
        !           214:            continue;
        !           215:        }
        !           216: 
        !           217:        if (sysin) {
        !           218: usage: ;
        !           219:            fprintf (stderr,
        !           220:                "usage: rosy [-pepsy] [-d] [-o module.py] [-s] module.ry\n");
        !           221:            exit (1);
        !           222:        }
        !           223: 
        !           224:        if (*cp == '-') {
        !           225:            if (*++cp != NULL)
        !           226:                goto usage;
        !           227:            sysin = "";
        !           228:        }
        !           229:        sysin = cp;
        !           230: 
        !           231:        if (sysout[0])
        !           232:            continue;
        !           233:        if (sp = rindex (cp, '/'))
        !           234:            sp++;
        !           235:        if (sp == NULL || *sp == NULL)
        !           236:            sp = cp;
        !           237:        sp += strlen (cp = sp) - 3;
        !           238:        if (sp > cp && strcmp (sp, ".ry") == 0)
        !           239:            (void) sprintf (sysout, "%.*s.py", sp - cp, cp);
        !           240:        else
        !           241:            (void) sprintf (sysout, "%s.py", cp);
        !           242:     }
        !           243: 
        !           244:     switch (rosydebug = (cp = getenv ("ROSYTEST")) && *cp ? atoi (cp) : 0) {
        !           245:        case 2:
        !           246:            yydebug++;          /* fall */
        !           247:        case 1:
        !           248:            sflag++;            /*   .. */
        !           249:        case 0:
        !           250:            break;
        !           251:     }
        !           252: 
        !           253:     if (sysin == NULLCP)
        !           254:        sysin = "";
        !           255: 
        !           256:     if (*sysin && freopen (sysin, "r", stdin) == NULL) {
        !           257:        fprintf (stderr, "unable to read "), perror (sysin);
        !           258:        exit (1);
        !           259:     }
        !           260: 
        !           261:     if (strcmp (sysout, "-") == 0)
        !           262:        sysout[0] = NULL;
        !           263:     if (*sysout && freopen (sysout, "w", stdout) == NULL) {
        !           264:        fprintf (stderr, "unable to write "), perror (sysout);
        !           265:        exit (1);
        !           266:     }
        !           267: 
        !           268:     if (cp = index (rosyversion, ')'))
        !           269:        for (cp++; *cp != ' '; cp++)
        !           270:            if (*cp == NULL) {
        !           271:                cp = NULL;
        !           272:                break;
        !           273:            }
        !           274:     if (cp == NULL)
        !           275:        cp = rosyversion + strlen (rosyversion);
        !           276:     (void) sprintf (autogen, "%*.*s", 
        !           277:            cp - rosyversion, cp - rosyversion, rosyversion);
        !           278:     printf ("-- automatically generated by %s, do not edit!\n\n", autogen);
        !           279: 
        !           280:     initoidtbl ();
        !           281: 
        !           282:     exit (yyparse ());         /* NOTREACHED */
        !           283: }
        !           284: 
        !           285: /*    ERRORS */
        !           286: 
        !           287: yyerror (s)
        !           288: register char   *s;
        !           289: {
        !           290:     yyerror_aux (s);
        !           291: 
        !           292:     if (*sysout)
        !           293:        (void) unlink (sysout);
        !           294:     if (*sysdef)
        !           295:        (void) unlink (sysdef);
        !           296:     if (*systbl)
        !           297:        (void) unlink (systbl);
        !           298:     if (*systub)
        !           299:        (void) unlink (systub);
        !           300: 
        !           301:     exit (1);
        !           302: }
        !           303: 
        !           304: #ifndef lint
        !           305: warning (va_alist)
        !           306: va_dcl
        !           307: {
        !           308:     char       buffer[BUFSIZ];
        !           309:     char       buffer2[BUFSIZ];
        !           310:     char       *cp;
        !           311:     va_list    ap;
        !           312: 
        !           313:     va_start (ap);
        !           314: 
        !           315:     _asprintf (buffer, NULLCP, ap);
        !           316: 
        !           317:     va_end (ap);
        !           318: 
        !           319:     (void) sprintf (buffer2, "Warning: %s", buffer);
        !           320:     yyerror_aux (buffer2);
        !           321: }
        !           322: 
        !           323: #else
        !           324: 
        !           325: /* VARARGS1 */
        !           326: warning (fmt)
        !           327: char   *fmt;
        !           328: {
        !           329:     warning (fmt);
        !           330: }
        !           331: #endif
        !           332: 
        !           333: static yyerror_aux (s)
        !           334: register char   *s;
        !           335: {
        !           336:     if (linepos)
        !           337:        fprintf (stderr, "\n"), linepos = 0;
        !           338: 
        !           339:     if (eval)
        !           340:        fprintf (stderr, "%s %s: ", yymode, eval);
        !           341:     else
        !           342:        fprintf (stderr, "line %d: ", yylineno);
        !           343:     fprintf (stderr, "%s\n", s);
        !           344:     if (!eval)
        !           345:        fprintf (stderr, "last token read was \"%s\"\n", yytext);
        !           346: }
        !           347: 
        !           348: /*  */
        !           349: 
        !           350: #ifndef        lint
        !           351: myyerror (va_alist)
        !           352: va_dcl
        !           353: {
        !           354:     char    buffer[BUFSIZ];
        !           355:     va_list ap;
        !           356: 
        !           357:     va_start (ap);
        !           358: 
        !           359:     _asprintf (buffer, NULLCP, ap);
        !           360: 
        !           361:     va_end (ap);
        !           362: 
        !           363:     yyerror (buffer);
        !           364: }
        !           365: #else
        !           366: /* VARARGS */
        !           367: 
        !           368: myyerror (fmt)
        !           369: char   *fmt;
        !           370: {
        !           371:     myyerror (fmt);
        !           372: }
        !           373: #endif
        !           374: 
        !           375: #ifdef        notyet
        !           376: #ifndef       lint
        !           377: static        pyyerror (va_alist)
        !           378: va_dcl
        !           379: {
        !           380:     char    buffer[BUFSIZ];
        !           381:     register YP       yp;
        !           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:     if (*sysout)
        !           395:       (void) unlink (sysout);
        !           396:     if (*sysdef)
        !           397:       (void) unlink (sysdef);
        !           398:     if (*systbl)
        !           399:       (void) unlink (systbl);
        !           400:     if (*systub)
        !           401:       (void) unlink (systub);
        !           402: 
        !           403:     exit (1);
        !           404: }
        !           405: #else
        !           406: /* VARARGS */
        !           407: +
        !           408: static        pyyerror (yp, fmt)
        !           409: YP    yp;
        !           410: char   *fmt;
        !           411: {
        !           412:     pyyerror (yp, fmt);
        !           413: }
        !           414: #endif
        !           415: #endif
        !           416: 
        !           417: /*  */
        !           418: 
        !           419: yywrap () {
        !           420:     if (linepos)
        !           421:        fprintf (stderr, "\n"), linepos = 0;
        !           422: 
        !           423:     return 1;
        !           424: }
        !           425: 
        !           426: /*  */
        !           427: 
        !           428: /* ARGSUSED */
        !           429: 
        !           430: yyprint (s, f, top)
        !           431: char   *s;
        !           432: int    f,
        !           433:        top;
        !           434: {
        !           435: }
        !           436: 
        !           437: static  yyprint_aux (s, mode)
        !           438: char   *s,
        !           439:        *mode;
        !           440: {
        !           441:     int            len;
        !           442:     static int nameoutput = 0;
        !           443:     static int outputlinelen = 79;
        !           444: 
        !           445:     if (sflag)
        !           446:        return;
        !           447: 
        !           448:     if (strcmp (yymode, mode)) {
        !           449:        if (linepos)
        !           450:            fprintf (stderr, "\n\n");
        !           451: 
        !           452:        fprintf (stderr, "%s", mymodule);
        !           453:        nameoutput = (linepos = strlen (mymodule)) + 1;
        !           454: 
        !           455:        fprintf (stderr, " %ss", yymode = mode);
        !           456:        linepos += strlen (yymode) + 1;
        !           457:        fprintf (stderr, ":");
        !           458:        linepos += 2;
        !           459:     }
        !           460: 
        !           461:     len = strlen (s);
        !           462:     if (linepos != nameoutput)
        !           463:        if (len + linepos + 1 > outputlinelen)
        !           464:            fprintf (stderr, "\n%*s", linepos = nameoutput, "");
        !           465:        else
        !           466:            fprintf (stderr, " "), linepos++;
        !           467:     fprintf (stderr, "%s", s);
        !           468:     linepos += len;
        !           469: }
        !           470: 
        !           471: /*    PASS1 */
        !           472: 
        !           473: pass1 ()
        !           474: {
        !           475:     printf ("%s ", mymodule);
        !           476:     if (mymoduleid)
        !           477:        printf ("%s ", oidprint(mymoduleid));
        !           478:     printf ("DEFINITIONS ::=\n\n");
        !           479: }
        !           480: 
        !           481: /*  */
        !           482: 
        !           483: pass1_op (mod, id, arg, result, errors, linked, opcode)
        !           484: char   *mod,
        !           485:        *id;
        !           486: YP     arg,
        !           487:        result;
        !           488: YV     errors;
        !           489: YV     linked;
        !           490: int    opcode;
        !           491: {
        !           492:     register SY            sy;
        !           493:     register YO            yo;
        !           494: 
        !           495:     if ((yo = (YO) calloc (1, sizeof *yo)) == NULLYO)
        !           496:        yyerror ("out of memory");
        !           497: 
        !           498:     yo -> yo_name = id;
        !           499:     yo -> yo_arg = arg;
        !           500:     yo -> yo_result = result;
        !           501:     yo -> yo_errors = errors;
        !           502:     yo -> yo_linked = linked;
        !           503:     yo -> yo_opcode = opcode;
        !           504: 
        !           505:     if (rosydebug) {
        !           506:        if (linepos)
        !           507:            fprintf (stderr, "\n"), linepos = 0;
        !           508: 
        !           509:        fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
        !           510:        print_op (yo, 0);
        !           511:        fprintf (stderr, "--------\n");
        !           512:     }
        !           513:     else
        !           514:        yyprint_aux (id, "operation");
        !           515: 
        !           516:     sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id);
        !           517:     sy -> sy_op = yo;
        !           518:     myoperations = add_symbol (myoperations, sy);
        !           519: }
        !           520: 
        !           521: /*  */
        !           522: 
        !           523: pass1_err (mod, id, param, errcode)
        !           524: char   *mod,
        !           525:        *id;
        !           526: YP     param;
        !           527: int    errcode;
        !           528: {
        !           529:     register SY            sy;
        !           530:     register YE            ye;
        !           531: 
        !           532:     if ((ye = (YE) calloc (1, sizeof *ye)) == NULLYE)
        !           533:        yyerror ("out of memory");
        !           534: 
        !           535:     ye -> ye_name = id;
        !           536:     ye -> ye_param = param;
        !           537:     ye -> ye_errcode = errcode;
        !           538:     ye -> ye_offset = erroff++;
        !           539: 
        !           540:     if (rosydebug) {
        !           541:        if (linepos)
        !           542:            fprintf (stderr, "\n"), linepos = 0;
        !           543: 
        !           544:        fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
        !           545:        print_err (ye, 0);
        !           546:        fprintf (stderr, "--------\n");
        !           547:     }
        !           548:     else
        !           549:        yyprint_aux (id, "error");
        !           550: 
        !           551:     sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id);
        !           552:     sy -> sy_err = ye;
        !           553:     myerrors = add_symbol (myerrors, sy);
        !           554: }
        !           555: 
        !           556: /*  */
        !           557: 
        !           558: pass1_type (encpref, decpref, prfpref, mod, id, yp)
        !           559: register char  *encpref,
        !           560:               *decpref,
        !           561:               *prfpref,
        !           562:               *mod,
        !           563:               *id;
        !           564: register YP    yp;
        !           565: {
        !           566:     register SY            sy;
        !           567: 
        !           568:     if (dflag && lookup_type (mod, id))        /* no duplicate entries, please... */
        !           569:        return;
        !           570: 
        !           571:     if (rosydebug) {
        !           572:        if (linepos)
        !           573:            fprintf (stderr, "\n"), linepos = 0;
        !           574: 
        !           575:        fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
        !           576:        print_type (yp, 0);
        !           577:        fprintf (stderr, "--------\n");
        !           578:     }
        !           579:     else
        !           580:        if (!(yp -> yp_flags & YP_IMPORTED))
        !           581:            yyprint_aux (id, "type");
        !           582: 
        !           583:     sy = new_symbol (encpref, decpref, prfpref, mod, id);
        !           584:     sy -> sy_type = yp;
        !           585:     mytypes = add_symbol (mytypes, sy);
        !           586: }
        !           587: 
        !           588: /*    PASS2 */
        !           589: 
        !           590: pass2 () {
        !           591:     int            i;
        !           592:     register SY            sy,
        !           593:                    sy2;
        !           594:     register YP            yp;
        !           595: 
        !           596:     if (!bflag)
        !           597:        bflag = mymodule;
        !           598:     if (!sflag)
        !           599:        (void) fflush (stderr);
        !           600: 
        !           601:     if(!mymodulename)
        !           602:        mymodulename = mymodule;
        !           603:     modsym_aux (mymodulename, mymodaux);
        !           604:     if (oplistorig[0]) {
        !           605:        opvc = sstr2arg (oplistorig, NOPS, opvp, ", \n");
        !           606:        if (opvc < 0)
        !           607:            opvc = 0;
        !           608:     }
        !           609: 
        !           610:     (void) sprintf (sysdef, "%s-ops.h", bflag);
        !           611:     if ((fdef = fopen (sysdef, "w")) == NULL)
        !           612:        myyerror ("unable to write %s", sysdef);
        !           613:     fprintf (fdef, "/* automatically generated by %s, do not edit! */\n\n",
        !           614:            autogen);
        !           615:     (void) sprintf (systbl, "%s-ops.c", bflag);
        !           616:     if ((ftbl = fopen (systbl, "w")) == NULL)
        !           617:        myyerror ("unable to write %s", systbl);
        !           618:     fprintf (ftbl, "/* automatically generated by %s, do not edit! */\n\n",
        !           619:            autogen);
        !           620: 
        !           621:     if (!Pepsyflag) {
        !           622:         fprintf (fdef, "#include %s\n\n\n",
        !           623:                 mflag ? "\"rosy.h\"" : "<isode/rosy.h>");
        !           624:     } else {
        !           625:         fprintf (ftbl, "#include \"%s-types.h\"\n\n", bflag); /* XXX */
        !           626:         fprintf (fdef, "#include %s\n\n\n",
        !           627:                 mflag ? "\"rosy.h\"" : "<isode/rosy.h>");
        !           628:     }
        !           629: 
        !           630:     fprintf (ftbl, "#include <stdio.h>\n");
        !           631:     fprintf (ftbl, "#include \"%s\"\n\n\n", sysdef);
        !           632:     if (!Pepsyflag) {
        !           633:        fprintf (ftbl, "#include \"%s-types.h\"\n\n", bflag);   /* XXX */
        !           634:     }
        !           635: 
        !           636:     (void) sprintf (systub, "%s-stubs.c", bflag);
        !           637:     if ((fstb = fopen (systub, "w")) == NULL)
        !           638:        myyerror ("unable to write %s", systbl);
        !           639:     fprintf (fstb, "/* automatically generated by %s, do not edit! */\n\n",
        !           640:            autogen);
        !           641:     fprintf (fstb, "#include <stdio.h>\n");
        !           642:     fprintf (fstb, "#include \"%s\"\n", sysdef);
        !           643:     fprintf (fstb, "#include \"%s-types.h\"\n\n", bflag);      /* XXX */
        !           644: 
        !           645:     fprintf (fdef, "\t\t\t\t\t/* OPERATIONS */\n\n");
        !           646:     fprintf (fdef, "extern struct RyOperation table_%s_Operations[];\n\n",
        !           647:        mymodaux);
        !           648: 
        !           649:     fprintf (ftbl, "\t\t\t\t\t/* OPERATIONS */\n\n");
        !           650: 
        !           651:     yymode = "operation";
        !           652:     for (sy = myoperations; sy; sy = sy -> sy_next) {
        !           653:        if (sy -> sy_module == NULLCP)
        !           654:            yyerror ("no module name associated with symbol");
        !           655: 
        !           656:        eval = sy -> sy_name;
        !           657:        if ((i = sy -> sy_op -> yo_opcode) < 0)
        !           658:            yyerror_aux ("negative operation code (warning)");
        !           659:        for (sy2 = sy -> sy_next; sy2; sy2 = sy2 -> sy_next)
        !           660:            if (i == sy2 -> sy_op -> yo_opcode) {
        !           661:                yyerror_aux ("non-unique operation codes (warning)");
        !           662:                fprintf (stderr, "\tvalue=%d op1=%s op2=%s\n", i,
        !           663:                        sy -> sy_op -> yo_name, sy2 -> sy_op -> yo_name);
        !           664:            }
        !           665:        if (opvc) {
        !           666:            for (i = 0; i < opvc; i++)
        !           667:                if (strcmp (opvp[i], sy -> sy_op -> yo_name) == 0)
        !           668:                    break;
        !           669:            if (i >= opvc)
        !           670:                continue;
        !           671:        }
        !           672:        do_op1 (sy -> sy_op, eval);
        !           673:     }
        !           674: 
        !           675:     fprintf (fdef, "\n#ifndef\tlint\n");
        !           676:     fprintf (fstb, "\n#ifdef\tlint\n");
        !           677:     fprintf (ftbl, "struct RyOperation table_%s_Operations[] = {\n", mymodaux);
        !           678:     for (sy = myoperations; sy; sy = sy -> sy_next) {
        !           679:        if (opvc) {
        !           680:            for (i = 0; i < opvc; i++)
        !           681:                if (strcmp (opvp[i], sy -> sy_op -> yo_name) == 0)
        !           682:                    break;
        !           683:            if (i >= opvc)
        !           684:                continue;
        !           685:        }
        !           686:        do_op2 (sy -> sy_op, eval = sy -> sy_name);
        !           687:     }
        !           688:     fprintf (fdef, "#endif\n");
        !           689:     fprintf (fstb, "#endif\n");
        !           690:     fprintf (ftbl, "    NULL\n};\n\n");
        !           691: 
        !           692:     fprintf (fdef, "\n\n\t\t\t\t\t/* ERRORS */\n\n");
        !           693:     fprintf (fdef, "extern struct RyError table_%s_Errors[];\n\n", mymodaux);
        !           694:        
        !           695:     fprintf (ftbl, "\n\t\t\t\t\t/* ERRORS */\n\n");
        !           696: 
        !           697:     yymode = "error";
        !           698:     for (sy = myerrors; sy; sy = sy -> sy_next) {
        !           699:        if (sy -> sy_module == NULLCP)
        !           700:            yyerror ("no module name associated with symbol");
        !           701: 
        !           702:        eval = sy -> sy_name;
        !           703:        if ((i = sy -> sy_err -> ye_errcode) < 0)
        !           704:            yyerror_aux ("negative error code (warning)");
        !           705:        for (sy2 = sy -> sy_next; sy2; sy2 = sy2 -> sy_next)
        !           706:            if (i == sy2 -> sy_err -> ye_errcode) {
        !           707:                yyerror_aux ("non-unique error codes (warning)");
        !           708:                fprintf (stderr, "\tvalue=%d err1=%s err2=%s\n", i,
        !           709:                        sy -> sy_err -> ye_name, sy2 -> sy_err -> ye_name);
        !           710:            }
        !           711:        do_err1 (sy -> sy_err, eval);
        !           712:     }
        !           713: 
        !           714:     fprintf (ftbl, "struct RyError table_%s_Errors[] = {\n", mymodaux);
        !           715:     for (sy = myerrors; sy; sy = sy -> sy_next)
        !           716:        do_err2 (sy -> sy_err, eval = sy -> sy_name);
        !           717:     fprintf (ftbl, "    NULL\n};\n");
        !           718: 
        !           719:     if (Cflag)
        !           720:        printf ("\n");
        !           721:     printf ("BEGIN\n");
        !           722: 
        !           723:     yymode = "type";
        !           724:     yyencpref = yydecpref = yyprfpref = "none";
        !           725:     for (sy = mytypes; sy; sy = sy -> sy_next) {
        !           726:        eval = sy -> sy_name;
        !           727:        yp = sy -> sy_type;
        !           728:        if (sy -> sy_module == NULLCP)
        !           729:            yyerror ("no module name associated with symbol");
        !           730:        if (yp -> yp_flags & YP_IMPORTED)
        !           731:            continue;
        !           732: 
        !           733:        if (!dflag) {
        !           734:            if (!(yp -> yp_direction & YP_ENCODER))
        !           735:                sy -> sy_encpref = "none";
        !           736:            if (!(yp -> yp_direction & YP_DECODER))
        !           737:                sy -> sy_decpref = "none";
        !           738:            if (!(yp -> yp_direction & YP_PRINTER))
        !           739:                sy -> sy_prfpref = "none";
        !           740:            if (strcmp (yyencpref, sy -> sy_encpref)
        !           741:                    || strcmp (yydecpref, sy -> sy_decpref)
        !           742:                    || strcmp (yyprfpref, sy -> sy_prfpref))
        !           743:                printf ("\nSECTIONS %s %s %s\n",
        !           744:                        yyencpref = sy -> sy_encpref,
        !           745:                        yydecpref = sy -> sy_decpref,
        !           746:                        yyprfpref = sy -> sy_prfpref);
        !           747:        }
        !           748:        printf ("\n%s", sy -> sy_name);
        !           749:        if (yp -> yp_action0)
        !           750:            act2prf (yp -> yp_action0, 1, "\n%*s%%{", "%%}\n%*s");
        !           751:        else
        !           752:            printf (" ");
        !           753:        printf ("::=\n");
        !           754:        if (!dflag && !(yp -> yp_flags & YP_PULLEDUP) && yp -> yp_action1) {
        !           755:            act2prf (yp -> yp_action1, 1, "%*s%%{", "%%}\n");
        !           756:            yp -> yp_flags |= YP_PULLEDUP;
        !           757:        }
        !           758:        do_type (yp, (yp -> yp_flags & YP_TAG) ? 1 : 2, eval);
        !           759:        printf ("\n");
        !           760: 
        !           761:        if (ferror (stdout) || ferror (fdef) || ferror (ftbl) || ferror (fstb))
        !           762:            myyerror ("write error - %s", sys_errname (errno));
        !           763: 
        !           764:     }
        !           765: 
        !           766:     printf ("\nEND\n");
        !           767: 
        !           768:     (void) fflush (stdout);
        !           769:     (void) fflush (fdef);
        !           770:     (void) fclose (ftbl);
        !           771:     (void) fclose (fstb);
        !           772: 
        !           773:     if (ferror (stdout) || ferror (fdef) || ferror (ftbl) || ferror (fstb))
        !           774:        myyerror ("write error - %s", sys_errname (errno));
        !           775: 
        !           776:     (void) fclose (fdef);
        !           777: 
        !           778:     (void) fclose (ftbl);
        !           779: 
        !           780:     (void) fclose (fstb);
        !           781: }
        !           782: 
        !           783: /*  */
        !           784: 
        !           785: /* ARGSUSED */
        !           786: 
        !           787: static do_op1 (yo, id)
        !           788: register YO    yo;
        !           789: char   *id;
        !           790: {
        !           791:     register YE            ye;
        !           792:     register YP            yp;
        !           793:     register YV            yv;
        !           794: 
        !           795:     fprintf (fdef, "\t\t\t\t\t/* OPERATION %s */\n", yo -> yo_name);
        !           796:     fprintf (fdef, "#define operation_%s\t%d\n\n",
        !           797:            modsym (mymodule, yo -> yo_name, NULLCP), yo -> yo_opcode);
        !           798: 
        !           799:     fprintf (ftbl, "\t\t\t\t\t/* OPERATION %s */\n", yo -> yo_name);
        !           800: 
        !           801:     normalize (&yo -> yo_arg, yo -> yo_name);
        !           802:     if (!Pepsyflag && (yp = yo -> yo_arg)) {
        !           803:        fprintf (ftbl, "int\t%s (),\n",
        !           804:                modsym (yp -> yp_module, yp -> yp_identifier, "encode"));
        !           805:        fprintf (ftbl, "\t%s (),\n",
        !           806:                modsym (yp -> yp_module, yp -> yp_identifier, "decode"));
        !           807:        fprintf (ftbl, "\t%s ();\n",
        !           808:                modsym (yp -> yp_module, yp -> yp_identifier, "free"));
        !           809:     }
        !           810: 
        !           811:     normalize (&yo -> yo_result, yo -> yo_name);
        !           812:     if (!Pepsyflag && (yp = yo -> yo_result)) {
        !           813:        fprintf (ftbl, "int\t%s (),\n",
        !           814:                modsym (yp -> yp_module, yp -> yp_identifier, "encode"));
        !           815:        fprintf (ftbl, "\t%s (),\n",
        !           816:                modsym (yp -> yp_module, yp -> yp_identifier, "decode"));
        !           817:        fprintf (ftbl, "\t%s ();\n\n",
        !           818:                modsym (yp -> yp_module, yp -> yp_identifier, "free"));
        !           819:     }
        !           820: 
        !           821:     if (!Pepsyflag) {
        !           822:        fprintf (fdef, "#ifdef\tINVOKER\n");
        !           823:     }
        !           824:     if (!Pepsyflag || Defsflag) {
        !           825:        fprintf (fdef, "#define\t%s_argument\t",
        !           826:                modsym (mymodule, yo -> yo_name, "encode"));
        !           827:        if (yp = yo -> yo_arg)
        !           828:            fprintf (fdef, "%s\n",
        !           829:                    modsym (yp -> yp_module, yp -> yp_identifier, "encode"));
        !           830:        else
        !           831:            fprintf (fdef, "NULLIFP\n");
        !           832:        fprintf (fdef, "#define\t%s_result\t",
        !           833:                modsym (mymodule, yo -> yo_name, "decode"));
        !           834:        if (yp = yo -> yo_result)
        !           835:            fprintf (fdef, "%s\n",
        !           836:                    modsym (yp -> yp_module, yp -> yp_identifier, "decode"));
        !           837:        else
        !           838:            fprintf (fdef, "NULLIFP\n");
        !           839:        fprintf (fdef, "#define\t%s_result\t",
        !           840:                modsym (mymodule, yo -> yo_name, "free"));
        !           841:        if (yp = yo -> yo_result)
        !           842:            fprintf (fdef, "%s\n",
        !           843:                    modsym (yp -> yp_module, yp -> yp_identifier, "free"));
        !           844:        else
        !           845:            fprintf (fdef, "NULLIFP\n");
        !           846:     }
        !           847:     if (!Pepsyflag) {
        !           848:        fprintf (fdef, "#else\n");
        !           849:        fprintf (fdef, "#define\t%s_argument\tNULLIFP\n",
        !           850:                modsym (mymodule, yo -> yo_name, "encode"));
        !           851:        fprintf (fdef, "#define\t%s_result\tNULLIFP\n",
        !           852:                modsym (mymodule, yo -> yo_name, "decode"));
        !           853:        fprintf (fdef, "#define\t%s_result\tNULLIFP\n",
        !           854:                modsym (mymodule, yo -> yo_name, "free"));
        !           855:        fprintf (fdef, "#endif\n\n");
        !           856: 
        !           857:        fprintf (fdef, "#ifdef\tPERFORMER\n");
        !           858:     }
        !           859:     if (!Pepsyflag || Defsflag) {
        !           860:        fprintf (fdef, "#define\t%s_argument\t",
        !           861:                modsym (mymodule, yo -> yo_name, "decode"));
        !           862:        if (yp = yo -> yo_arg)
        !           863:            fprintf (fdef, "%s\n",
        !           864:                    modsym (yp -> yp_module, yp -> yp_identifier, "decode"));
        !           865:        else
        !           866:            fprintf (fdef, "NULLIFP\n");
        !           867:        fprintf (fdef, "#define\t%s_argument\t",
        !           868:                modsym (mymodule, yo -> yo_name, "free"));
        !           869:        if (yp = yo -> yo_arg)
        !           870:            fprintf (fdef, "%s\n",
        !           871:                    modsym (yp -> yp_module, yp -> yp_identifier, "free"));
        !           872:        else
        !           873:            fprintf (fdef, "NULLIFP\n");
        !           874:        fprintf (fdef, "#define\t%s_result\t",
        !           875:                modsym (mymodule, yo -> yo_name, "encode"));
        !           876:        if (yp = yo -> yo_result)
        !           877:            fprintf (fdef, "%s\n",
        !           878:                    modsym (yp -> yp_module, yp -> yp_identifier, "encode"));
        !           879:        else
        !           880:            fprintf (fdef, "NULLIFP\n");
        !           881:     }
        !           882:     if (!Pepsyflag) {
        !           883:        fprintf (fdef, "#else\n");
        !           884:        fprintf (fdef, "#define\t%s_argument\tNULLIFP\n",
        !           885:                modsym (mymodule, yo -> yo_name, "decode"));
        !           886:        fprintf (fdef, "#define\t%s_argument\tNULLIFP\n",
        !           887:                modsym (mymodule, yo -> yo_name, "free"));
        !           888:        fprintf (fdef, "#define\t%s_result\tNULLIFP\n",
        !           889:                modsym (mymodule, yo -> yo_name, "encode"));
        !           890:        fprintf (fdef, "#endif\n\n");
        !           891:     }
        !           892: 
        !           893:     if (yv = yo -> yo_errors) {
        !           894:        if (yv -> yv_code != YV_VALIST)
        !           895:            myyerror ("unexpected value: %d", yv -> yv_code);
        !           896:        fprintf (ftbl, "static struct RyError *errors_%s[] = {\n",
        !           897:            modsym (mymodulename, yo -> yo_name, NULLCP));
        !           898:        for (yv = yv -> yv_idlist; yv; yv = yv -> yv_next) {
        !           899:            ye = lookup_err (yv);
        !           900:            fprintf (ftbl, "    &table_%s_Errors[%d]%s\n", mymodaux,
        !           901:                    ye -> ye_offset, yv -> yv_next ? "," : "");
        !           902:        }
        !           903:        fprintf (ftbl, "};\n\n");
        !           904:     }
        !           905: 
        !           906:     fprintf (ftbl, "\n");
        !           907: }
        !           908: 
        !           909: /*  */
        !           910: 
        !           911: /* ARGSUSED */
        !           912: 
        !           913: static do_op2 (yo, id)
        !           914: register YO    yo;
        !           915: char   *id;
        !           916: {
        !           917:     register YP            yp;
        !           918: 
        !           919:     fprintf (fdef, "\n#define stub_%s(sd,id,in,rfx,efx,class,roi)\\\n",
        !           920:             modsym (mymodule, yo -> yo_name, NULLCP));
        !           921:     fprintf (fdef, "RyStub ((sd), table_%s_Operations,", mymodaux);
        !           922:     fprintf (fdef, " operation_%s, (id), NULLIP,\\\n",
        !           923:            modsym (mymodule, yo -> yo_name, NULLCP));
        !           924:     fprintf (fdef, "\t(caddr_t) (in), (rfx), (efx), (class), (roi))\n");
        !           925: 
        !           926:     fprintf (fdef, "\n#define op_%s(sd,in,out,rsp,roi)\\\n",
        !           927:            modsym (mymodule, yo -> yo_name, NULLCP));
        !           928:     fprintf (fdef, "RyOperation ((sd), table_%s_Operations,", mymodaux);
        !           929:     fprintf (fdef,
        !           930:             " operation_%s,\\\n\t(caddr_t) (in), (out), (rsp), (roi))\n",
        !           931:             modsym (mymodule, yo -> yo_name, NULLCP));
        !           932: 
        !           933:     fprintf (fstb, "\nint\tstub_%s (sd, id, in, rfx, efx, class, roi)\n",
        !           934:            modsym (mymodule, yo -> yo_name, NULLCP));
        !           935:     fprintf (fstb, "int\tsd,\n\tid,\n\tclass;\n");
        !           936:     if (yp = yo -> yo_arg)
        !           937:        fprintf (fstb, "struct %s*",
        !           938:                modsym (yp -> yp_module, yp -> yp_identifier, "type"));
        !           939:     else
        !           940:        fprintf (fstb, "caddr_t");
        !           941:     fprintf (fstb, " in;\n");
        !           942:     fprintf (fstb,
        !           943:             "IFP\trfx,\n\tefx;\nstruct RoSAPindication *roi;\n");
        !           944:     fprintf (fstb, "{\n    return RyStub (sd, table_%s_Operations, ",
        !           945:                mymodaux);
        !           946:     fprintf (fstb,
        !           947:             "operation_%s, id, NULLIP,\n\t\t(caddr_t) in, rfx, efx, class, roi);\n",
        !           948:             modsym (mymodule, yo -> yo_name, NULLCP));
        !           949:     fprintf (fstb, "}\n");
        !           950: 
        !           951:     fprintf (fstb, "\nint\top_%s (sd, in, out, rsp, roi)\n",
        !           952:            modsym (mymodule, yo -> yo_name, NULLCP));
        !           953:     fprintf (fstb, "int\tsd;\n");
        !           954:     if (yp = yo -> yo_arg)
        !           955:        fprintf (fstb, "struct %s*",
        !           956:                modsym (yp -> yp_module, yp -> yp_identifier, "type"));
        !           957:     else
        !           958:        fprintf (fstb, "caddr_t");
        !           959:     fprintf (fstb, " in;\n");
        !           960:     fprintf (fstb,
        !           961:            "caddr_t *out;\nint    *rsp;\nstruct RoSAPindication *roi;\n");
        !           962:     fprintf (fstb, "{\n    return RyOperation (sd, table_%s_Operations, ",
        !           963:                mymodaux);
        !           964:     fprintf (fstb, "operation_%s,\n\t\t(caddr_t) in, out, rsp, roi);\n",
        !           965:            modsym (mymodule, yo -> yo_name, NULLCP));
        !           966:     fprintf (fstb, "}\n");
        !           967: 
        !           968:     fprintf (ftbl, "\t\t\t\t\t/* OPERATION %s */\n", yo -> yo_name);
        !           969: 
        !           970:     fprintf (ftbl, "    \"%s\", operation_%s,\n",
        !           971:            yo -> yo_name, modsym (mymodule, yo -> yo_name, NULLCP));
        !           972:     if (Pepsyflag) {
        !           973:        if ((yp = yo->yo_arg)) {
        !           974:            if (yp->yp_code != YP_IDEFINED) {
        !           975:                fprintf(stderr, "\ndo_op2:arg: internal error for %s\n",
        !           976:                        yo->yo_name);
        !           977:                exit(1);
        !           978:            }
        !           979:            fprintf (ftbl, "\t&%s,\n ",
        !           980:                cmodsym(yp->yp_module, MODTYP_SUFFIX, PREFIX));
        !           981:            fprintf (ftbl, "\t%s,\n",
        !           982:                csymmod(yp->yp_module, yp->yp_identifier, PREFIX));
        !           983:        } else {
        !           984:            fprintf (ftbl, "\tNULL,\n ");
        !           985:            fprintf (ftbl, "\tNULL,\n");
        !           986:        }
        !           987:     } else {
        !           988:        fprintf (ftbl, "\t%s_argument,\n ",
        !           989:                modsym (mymodule, yo -> yo_name, "encode"));
        !           990:        fprintf (ftbl, "\t%s_argument,\n",
        !           991:                modsym (mymodule, yo -> yo_name, "decode"));
        !           992:        fprintf (ftbl, "\t%s_argument,\n",
        !           993:                modsym (mymodule, yo -> yo_name, "free"));
        !           994:     }
        !           995: 
        !           996:     if (Pepsyflag) {
        !           997:        fprintf (ftbl, "\t%d,\n", yo -> yo_result ? 1 : 0);
        !           998:        if ((yp = yo->yo_result)) {
        !           999:            if (yp->yp_code != YP_IDEFINED) {
        !          1000:                fprintf(stderr, "\ndo_op2:result: internal error for %s\n",
        !          1001:                     yo->yo_name);
        !          1002:                exit(1);
        !          1003:            }
        !          1004:            fprintf (ftbl, "\t&%s,\n ",
        !          1005:                cmodsym(yp->yp_module, MODTYP_SUFFIX, PREFIX));
        !          1006:            fprintf (ftbl, "\t%s,\n",
        !          1007:                csymmod(yp->yp_module, yp->yp_identifier, PREFIX));
        !          1008:        } else {
        !          1009:            fprintf (ftbl, "\tNULL,\n ");
        !          1010:            fprintf (ftbl, "\tNULL,\n");
        !          1011:        }
        !          1012:     } else {
        !          1013:        fprintf (ftbl, "\t%d, %s_result,\n",
        !          1014:                yo -> yo_result ? 1 : 0,
        !          1015:                modsym (mymodule, yo -> yo_name, "encode"));
        !          1016:        fprintf (ftbl, "\t   %s_result,\n",
        !          1017:                modsym (mymodule, yo -> yo_name, "decode"));
        !          1018:        fprintf (ftbl, "\t   %s_result,\n",
        !          1019:                modsym (mymodule, yo -> yo_name, "free"));
        !          1020:     }
        !          1021: 
        !          1022:     if (yo -> yo_errors)
        !          1023:        fprintf (ftbl, "\terrors_%s",
        !          1024:                modsym (mymodule, yo -> yo_name, NULLCP));
        !          1025:     else
        !          1026:        fprintf (ftbl, "\tNULL");
        !          1027:     fprintf (ftbl, ",\n\n");
        !          1028: }
        !          1029: 
        !          1030: /*  */
        !          1031: 
        !          1032: /* ARGSUSED */
        !          1033: 
        !          1034: static do_err1 (ye, id)
        !          1035: register YE    ye;
        !          1036: char   *id;
        !          1037: {
        !          1038:     register YP            yp;
        !          1039: 
        !          1040:     fprintf (fdef, "\t\t\t\t\t/* ERROR %s */\n", ye -> ye_name);
        !          1041:     fprintf (fdef, "#define error_%s\t%d\n\n", 
        !          1042:                modsym (mymodule, ye -> ye_name, NULLCP), ye -> ye_errcode);
        !          1043: 
        !          1044:     normalize (&ye -> ye_param, ye -> ye_name);
        !          1045:     if (!Pepsyflag) {
        !          1046:        if (yp = ye -> ye_param) {
        !          1047:            fprintf (ftbl, "int\t%s (),\n",
        !          1048:                    modsym (yp -> yp_module, yp -> yp_identifier, "encode"));
        !          1049:            fprintf (ftbl, "\t%s (),\n",
        !          1050:                    modsym (yp -> yp_module, yp -> yp_identifier, "decode"));
        !          1051:            fprintf (ftbl, "\t%s ();\n",
        !          1052:                    modsym (yp -> yp_module, yp -> yp_identifier, "free"));
        !          1053:        }
        !          1054:        fprintf (fdef, "#ifdef\tINVOKER\n");
        !          1055:        fprintf (fdef, "#define\t%s_parameter\t",
        !          1056:                modsym (mymodule, ye -> ye_name, "decode"));
        !          1057:        if (yp = ye -> ye_param)
        !          1058:            fprintf (fdef, "%s\n",
        !          1059:                    modsym (yp -> yp_module, yp -> yp_identifier, "decode"));
        !          1060:        else
        !          1061:            fprintf (fdef, "NULLIFP\n");
        !          1062:        fprintf (fdef, "#define\t%s_parameter\t",
        !          1063:                modsym (mymodule, ye -> ye_name, "free"));
        !          1064:        if (yp = ye -> ye_param)
        !          1065:            fprintf (fdef, "%s\n",
        !          1066:                    modsym (yp -> yp_module, yp -> yp_identifier, "free"));
        !          1067:        else
        !          1068:            fprintf (fdef, "NULLIFP\n");
        !          1069:        fprintf (fdef, "#else\n");
        !          1070:        fprintf (fdef, "#define\t%s_parameter\tNULLIFP\n",
        !          1071:                modsym (mymodule, ye -> ye_name, "decode"));
        !          1072:        fprintf (fdef, "#define\t%s_parameter\tNULLIFP\n",
        !          1073:                modsym (mymodule, ye -> ye_name, "free"));
        !          1074:        fprintf (fdef, "#endif\n\n");
        !          1075: 
        !          1076:        fprintf (fdef, "#ifdef\tPERFORMER\n");
        !          1077:        fprintf (fdef, "#define\t%s_parameter\t",
        !          1078:                modsym (mymodule, ye -> ye_name, "encode"));
        !          1079:        if (yp = ye -> ye_param)
        !          1080:            fprintf (fdef, "%s\n",
        !          1081:                    modsym (yp -> yp_module, yp -> yp_identifier, "encode"));
        !          1082:        else
        !          1083:            fprintf (fdef, "NULLIFP\n");
        !          1084:        fprintf (fdef, "#else\n");
        !          1085:        fprintf (fdef, "#define\t%s_parameter\tNULLIFP\n",
        !          1086:                modsym (mymodule, ye -> ye_name, "encode"));
        !          1087:        fprintf (fdef, "#endif\n\n\n");
        !          1088:      }
        !          1089: }
        !          1090: 
        !          1091: /*  */
        !          1092: 
        !          1093: /* ARGSUSED */
        !          1094: 
        !          1095: static do_err2 (ye, id)
        !          1096: register YE    ye;
        !          1097: char   *id;
        !          1098: {
        !          1099:     register YP        yp;
        !          1100: 
        !          1101:     fprintf (ftbl, "\t\t\t\t\t/* ERROR %s */\n", ye -> ye_name);
        !          1102: 
        !          1103:     fprintf (ftbl, "    \"%s\", error_%s,\n",
        !          1104:            ye -> ye_name, modsym (mymodule, ye -> ye_name, NULLCP));
        !          1105: 
        !          1106:     if (Pepsyflag) {
        !          1107:        if ((yp = ye->ye_param)) {
        !          1108:            fprintf (ftbl, "\t&%s,\n ",
        !          1109:                cmodsym(yp->yp_module, MODTYP_SUFFIX, PREFIX));
        !          1110:            fprintf (ftbl, "\t%s,\n",
        !          1111:                csymmod(yp->yp_module, yp->yp_identifier, PREFIX));
        !          1112:        } else {
        !          1113:            fprintf (ftbl, "\tNULL,\n\tNULL,\n");
        !          1114:        }
        !          1115:     } else {
        !          1116:        fprintf (ftbl, "\t%s_parameter,\n",
        !          1117:                modsym (mymodule, ye -> ye_name, "encode"));
        !          1118:        fprintf (ftbl, "\t%s_parameter,\n",
        !          1119:                modsym (mymodule, ye -> ye_name, "decode"));
        !          1120:        fprintf (ftbl, "\t%s_parameter,\n\n",
        !          1121:                modsym (mymodule, ye -> ye_name, "free"));
        !          1122:     }
        !          1123: }
        !          1124: 
        !          1125: /*  */
        !          1126: 
        !          1127: /* ARGSUSED */
        !          1128: 
        !          1129: static do_type (yp, level, id)
        !          1130: register YP yp;
        !          1131: int    level;
        !          1132: char   *id;
        !          1133: {
        !          1134:     register YP            y;
        !          1135:     register YV            yv;
        !          1136:     register YT            yt;
        !          1137: 
        !          1138:     printf ("%*s", level * 4, "");
        !          1139: 
        !          1140:     if (yp -> yp_flags & YP_ID) {
        !          1141:        printf ("%s", yp -> yp_id);
        !          1142:        if (!(yp -> yp_flags & YP_TAG)) {
        !          1143:            printf ("\n%*s", ++level * 4, "");
        !          1144:            if (!dflag
        !          1145:                    && !(yp -> yp_flags & YP_PULLEDUP)
        !          1146:                    && yp -> yp_action1) {
        !          1147:                act2prf (yp -> yp_action1, level, "%%{", "%%}\n%*s");
        !          1148:                yp -> yp_flags |= YP_PULLEDUP;
        !          1149:            }
        !          1150:        }
        !          1151:     }
        !          1152: 
        !          1153:     if (yp -> yp_flags & YP_TAG) {
        !          1154:        if (!(yt = yp -> yp_tag))
        !          1155:            myyerror ("lost tag");
        !          1156:        printf ("[%s%d]\n", classes[yt -> yt_class], val2int (yt -> yt_value));
        !          1157:        level++;
        !          1158:        printf ("%*s", level * 4, "");
        !          1159:        if (!dflag && !(yp -> yp_flags & YP_PULLEDUP) && yp -> yp_action1) {
        !          1160:            act2prf (yp -> yp_action1, level, "%%{", "%%}\n%*s");
        !          1161:            yp -> yp_flags |= YP_PULLEDUP;
        !          1162:        }
        !          1163:        if (yp -> yp_flags & YP_IMPLICIT)
        !          1164:            printf ("IMPLICIT ");
        !          1165:     }
        !          1166:     if (yp -> yp_flags & YP_BOUND)
        !          1167:        printf ("%s < ", yp -> yp_bound);
        !          1168:     if (yp -> yp_flags & YP_COMPONENTS)
        !          1169:        printf ("COMPONENTS OF ");
        !          1170:     if (yp -> yp_flags & YP_ENCRYPTED)
        !          1171:        printf ("ENCRYPTED ");
        !          1172: 
        !          1173:     switch (yp -> yp_code) {
        !          1174:        case YP_BOOL: 
        !          1175:            printf ("BOOLEAN");
        !          1176:            if (!dflag && yp -> yp_intexp)
        !          1177:                printf ("\n%*s[[b %s]]", level * 4, "", yp -> yp_intexp);
        !          1178:            break;
        !          1179: 
        !          1180:        case YP_INT: 
        !          1181:            printf ("INTEGER");
        !          1182:            if (!dflag && yp -> yp_intexp)
        !          1183:                printf ("\n%*s[[i %s]]", level * 4, "", yp -> yp_intexp);
        !          1184:            break;
        !          1185: 
        !          1186:        case YP_INTLIST: 
        !          1187:        case YP_ENUMLIST:
        !          1188:            if (yp -> yp_code == YP_ENUMLIST)
        !          1189:                printf ("ENUMERATED");
        !          1190:            else
        !          1191:                printf ("INTEGER");
        !          1192:            if (!dflag && yp -> yp_intexp)
        !          1193:                printf ("\n%*s[[i %s]]\n%*s{\n",
        !          1194:                    level * 4, "", yp -> yp_intexp, level * 4, "");
        !          1195:            else
        !          1196:                printf (" {\n");
        !          1197:            level++;
        !          1198:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !          1199:                if (!(yv -> yv_flags & YV_NAMED))
        !          1200:                    myyerror ("lost named number");
        !          1201:                printf ("%*s%s(%d)", level * 4, "", yv -> yv_named,
        !          1202:                        val2int (yv));
        !          1203:                if (!dflag && yv -> yv_action)
        !          1204:                    printf (" %%{%s%%}", yv -> yv_action);
        !          1205:                printf ("%s\n", yv -> yv_next ? "," : "");
        !          1206:            }
        !          1207:            level--;
        !          1208:            printf ("%*s}", level * 4, "");
        !          1209:            break;
        !          1210: 
        !          1211:        case YP_BIT: 
        !          1212:            printf ("BIT STRING");
        !          1213:            if (!dflag && yp -> yp_strexp)
        !          1214:                printf ("\n%*s[[x %s$%s]]", level * 4, "", yp -> yp_strexp,
        !          1215:                        yp -> yp_intexp);
        !          1216:            break;
        !          1217: 
        !          1218:        case YP_BITLIST: 
        !          1219:            if (!dflag && yp -> yp_strexp)
        !          1220:                printf ("BIT STRING\n%*s[[x %s$%s]]\n%*s{\n",
        !          1221:                        level * 4, "", yp -> yp_strexp, yp -> yp_intexp,
        !          1222:                        level * 4, "");
        !          1223:            else
        !          1224:                printf ("BIT STRING {\n");
        !          1225:            level++;
        !          1226:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !          1227:                if (!(yv -> yv_flags & YV_NAMED))
        !          1228:                    myyerror ("lost named number");
        !          1229:                printf ("%*s%s(%d)", level * 4, "", yv -> yv_named,
        !          1230:                        val2int (yv));
        !          1231:                if (!dflag && yv -> yv_action)
        !          1232:                    printf (" %%{%s%%}", yv -> yv_action);
        !          1233:                printf ("%s\n", yv -> yv_next ? "," : "");
        !          1234:            }
        !          1235:            level--;
        !          1236:            printf ("%*s}", level * 4, "");
        !          1237:            break;
        !          1238: 
        !          1239:        case YP_OCT: 
        !          1240:            printf ("OCTET STRING");
        !          1241:            if (dflag)
        !          1242:                break;
        !          1243:            if (yp -> yp_intexp)
        !          1244:                printf ("\n%*s[[o %s$%s]]", level * 4, "", yp -> yp_strexp,
        !          1245:                        yp -> yp_intexp);
        !          1246:            else
        !          1247:                if (yp -> yp_strexp)
        !          1248:                    printf ("\n%*s[[%c %s]]", level * 4, "", yp -> yp_prfexp,
        !          1249:                            yp -> yp_strexp);
        !          1250:            break;
        !          1251: 
        !          1252:        case YP_NULL: 
        !          1253:            printf ("NULL");
        !          1254:            break;
        !          1255: 
        !          1256:        case YP_REAL:
        !          1257:            printf ("REAL");
        !          1258:            if (!dflag && yp -> yp_strexp)
        !          1259:                    printf ("\n%*s[[r %s ]]", level * 4, "", yp -> yp_strexp);
        !          1260:            break;
        !          1261: 
        !          1262:        case YP_SEQ: 
        !          1263:            printf ("SEQUENCE");
        !          1264:            break;
        !          1265: 
        !          1266:        case YP_SEQTYPE: 
        !          1267:            printf ("SEQUENCE OF");
        !          1268:            if (yp -> yp_structname) {
        !          1269:                printf (" %%[ %s ", yp -> yp_structname);
        !          1270:                if (yp -> yp_ptrname)
        !          1271:                    printf ("$ %s ", yp -> yp_ptrname);
        !          1272:                printf ("%%]\n");
        !          1273:            }
        !          1274:            else
        !          1275:                printf ("\n");
        !          1276:            if (!dflag && yp -> yp_action3)
        !          1277:                act2prf (yp -> yp_action3, level + 1, "%*s%%{", "%%}\n");
        !          1278:            if (yp -> yp_flags & YP_CONTROLLED)
        !          1279:                printf ("%*s<<%s>>\n", (level + 1) * 4, "", yp -> yp_control);
        !          1280:            if (!yp -> yp_type)
        !          1281:                myyerror ("lost sequence type");
        !          1282:            do_type (yp -> yp_type, level + 1, "element");
        !          1283:            break;
        !          1284: 
        !          1285:        case YP_SEQLIST: 
        !          1286:            printf ("SEQUENCE");
        !          1287:            if (yp -> yp_structname) {
        !          1288:                printf (" %%[ %s ", yp -> yp_structname);
        !          1289:                if (yp -> yp_ptrname)
        !          1290:                    printf ("$ %s ", yp -> yp_ptrname);
        !          1291:                printf ("%%]");
        !          1292:            }
        !          1293:            if (!dflag && !(yp -> yp_flags & YP_PULLEDUP) && yp -> yp_action1)
        !          1294:                act2prf (yp -> yp_action1, level, "\n%*s    %%{",
        !          1295:                        "    %%}\n%*s{\n");
        !          1296:            else
        !          1297:                printf (yp -> yp_type ? " {\n" : " {");
        !          1298:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1299:                do_type (y,
        !          1300:                        level + ((y -> yp_flags & (YP_ID | YP_TAG)) ? 1 : 2),
        !          1301:                        "element");
        !          1302:                printf ("%s\n", y -> yp_next ? ",\n" : "");
        !          1303:            }
        !          1304:            printf (yp -> yp_type ? "%*s}" : "}", level * 4, "");
        !          1305:            break;
        !          1306: 
        !          1307:        case YP_SET: 
        !          1308:            printf ("SET");
        !          1309:            break;
        !          1310: 
        !          1311:        case YP_SETTYPE: 
        !          1312:            printf ("SET OF");
        !          1313:            if (yp -> yp_structname) {
        !          1314:                printf (" %%[ %s ", yp -> yp_structname);
        !          1315:                if (yp -> yp_ptrname)
        !          1316:                    printf ("$ %s ", yp -> yp_ptrname);
        !          1317:                printf ("%%]\n");
        !          1318:            }
        !          1319:            else
        !          1320:                printf ("\n");
        !          1321:            if (!dflag && yp -> yp_action3)
        !          1322:                act2prf (yp -> yp_action3, level + 1, "%*s%%{", "%%}\n");
        !          1323:            if (yp -> yp_flags & YP_CONTROLLED)
        !          1324:                printf ("%*s<<%s>>\n", (level + 1) * 4, "", yp -> yp_control);
        !          1325:            if (!yp -> yp_type)
        !          1326:                myyerror ("lost set type");
        !          1327:            do_type (yp -> yp_type, level + 1, "member");
        !          1328:            break;
        !          1329: 
        !          1330:        case YP_SETLIST: 
        !          1331:            printf ("SET");
        !          1332:            if (yp -> yp_structname) {
        !          1333:                printf (" %%[ %s ", yp -> yp_structname);
        !          1334:                if (yp -> yp_ptrname)
        !          1335:                    printf ("$ %s ", yp -> yp_ptrname);
        !          1336:                printf ("%%]");
        !          1337:            }
        !          1338:            if (!dflag && !(yp -> yp_flags & YP_PULLEDUP) && yp -> yp_action1)
        !          1339:                act2prf (yp -> yp_action1, level, "\n%*s    %%{",
        !          1340:                        "    %%}\n%*s{\n");
        !          1341:            else
        !          1342:                printf (yp -> yp_type ? " {\n" : " {");
        !          1343:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1344:                do_type (y,
        !          1345:                        level + ((y -> yp_flags & (YP_ID | YP_TAG)) ? 1 : 2),
        !          1346:                        "member");
        !          1347:                printf ("%s\n", y -> yp_next ? ",\n" : "");
        !          1348:            }
        !          1349:            printf (yp -> yp_type ? "%*s}" : "}", level * 4, "");
        !          1350:            break;
        !          1351: 
        !          1352:        case YP_CHOICE: 
        !          1353:            printf ("CHOICE");
        !          1354:            if (yp -> yp_structname) {
        !          1355:                printf (" %%[ %s ", yp -> yp_structname);
        !          1356:                if (yp -> yp_ptrname)
        !          1357:                    printf ("$ %s ", yp -> yp_ptrname);
        !          1358:                printf ("%%]");
        !          1359:            }
        !          1360:            if (!dflag
        !          1361:                    && !(yp -> yp_flags & YP_PULLEDUP)
        !          1362:                    && yp -> yp_action1) {
        !          1363:                act2prf (yp -> yp_action1, level, "\n%*s    %%{",
        !          1364:                        "    %%}\n%*s");
        !          1365:                if (yp -> yp_flags & YP_CONTROLLED)
        !          1366:                    printf ("    ");
        !          1367:            }
        !          1368:            else
        !          1369:                printf (" ");
        !          1370:            if (yp -> yp_flags & YP_CONTROLLED)
        !          1371:                printf ("<<%s>> ", yp -> yp_control);
        !          1372:            printf ("{\n");
        !          1373:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1374:                do_type (y,
        !          1375:                        level + ((y -> yp_flags & (YP_ID | YP_TAG)) ? 1 : 2),
        !          1376:                        "choice");
        !          1377:                printf ("%s\n", y -> yp_next ? ",\n" : "");
        !          1378:            }
        !          1379:            printf ("%*s}", level * 4, "");
        !          1380:            break;
        !          1381: 
        !          1382:        case YP_ANY: 
        !          1383:            printf ("ANY");
        !          1384:            break;
        !          1385: 
        !          1386:        case YP_OID: 
        !          1387:            printf ("OBJECT IDENTIFIER");
        !          1388:            if (!dflag && yp -> yp_strexp)
        !          1389:                printf ("\n%*s[[O %s]]", level * 4, "", yp -> yp_strexp);
        !          1390:            break;
        !          1391: 
        !          1392:        case YP_IDEFINED: 
        !          1393:            if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
        !          1394:                printf ("%s.", yp -> yp_module);
        !          1395:            printf ("%s", yp -> yp_identifier);
        !          1396:            if (yp -> yp_intexp) {
        !          1397:                if (yp -> yp_strexp)
        !          1398:                    printf ("\n%*s[[%c %s$%s]]", level * 4, "",
        !          1399:                            yp -> yp_prfexp, yp -> yp_strexp, yp -> yp_intexp);
        !          1400:                else
        !          1401:                    printf ("\n%*s[[%c %s]]", level * 4, "",
        !          1402:                            yp -> yp_prfexp, yp -> yp_intexp);
        !          1403:            }
        !          1404:            else
        !          1405:                if (yp -> yp_strexp)
        !          1406:                    printf ("\n%*s[[%c %s]]", level * 4, "",
        !          1407:                            yp -> yp_prfexp, yp -> yp_strexp);
        !          1408:            if (yp -> yp_flags & YP_PARMVAL)
        !          1409:                printf ("\n%*s[[p %s]]", level * 4, "", yp -> yp_parm);
        !          1410:            break;
        !          1411: 
        !          1412:        default: 
        !          1413:            myyerror ("unknown type: %d", yp -> yp_code);
        !          1414:     }
        !          1415: 
        !          1416:     if (!dflag && yp -> yp_action2)
        !          1417:        act2prf (yp -> yp_action2, level, "\n%*s%%{", "%%}");
        !          1418: 
        !          1419:     if (yp -> yp_flags & YP_OPTIONAL)
        !          1420:        printf ("\n%*sOPTIONAL", level * 4, "");
        !          1421:     else
        !          1422:        if (yp -> yp_flags & YP_DEFAULT) {
        !          1423:            if (!yp -> yp_default)
        !          1424:                myyerror ("lost default");
        !          1425:            printf ("\n%*sDEFAULT ", level * 4, "");
        !          1426:            val2prf (yp -> yp_default, level + 2);
        !          1427:        }
        !          1428:     if (yp -> yp_flags & YP_OPTCONTROL)
        !          1429:        printf (" <<%s>>", yp -> yp_optcontrol);
        !          1430: }
        !          1431: 
        !          1432: /*    ERROR HANDLING */
        !          1433: 
        !          1434: static YE  lookup_err (yv)
        !          1435: YV     yv;
        !          1436: {
        !          1437:     register char  *id,
        !          1438:                    *mod;
        !          1439:     register    SY sy;
        !          1440: 
        !          1441:     if (yv -> yv_code != YV_IDEFINED)
        !          1442:        myyerror ("unexpected value: %d", yv -> yv_code);
        !          1443:     id = yv -> yv_identifier;
        !          1444:     mod = yv -> yv_module;
        !          1445: 
        !          1446:     for (sy = myerrors; sy; sy = sy -> sy_next) {
        !          1447:        if (mod) {
        !          1448:            if (strcmp (sy -> sy_module, mod))
        !          1449:                continue;
        !          1450:        }
        !          1451:        else
        !          1452:            if (strcmp (sy -> sy_module, mymodule))
        !          1453:                continue;
        !          1454: 
        !          1455:        if (strcmp (sy -> sy_name, id) == 0)
        !          1456:            return sy -> sy_err;
        !          1457:     }
        !          1458: 
        !          1459:     if (mod)
        !          1460:        myyerror ("error %s.%s undefined", mod, id);
        !          1461:     else
        !          1462:        myyerror ("error %s undefined", id);
        !          1463: /* NOTREACHED */
        !          1464: }
        !          1465: 
        !          1466: /*    TYPE HANDLING */
        !          1467: 
        !          1468: static YP  lookup_type (mod, id)
        !          1469: register char *mod,
        !          1470:              *id;
        !          1471: {
        !          1472:     register SY            sy;
        !          1473: 
        !          1474:     for (sy = mytypes; sy; sy = sy -> sy_next) {
        !          1475:        if (mod) {
        !          1476:            if (strcmp (sy -> sy_module, mod))
        !          1477:                continue;
        !          1478:        }
        !          1479:        else
        !          1480:            if (strcmp (sy -> sy_module, mymodule)
        !          1481:                    && strcmp (sy -> sy_module, "UNIV"))
        !          1482:                continue;
        !          1483: 
        !          1484:        if (strcmp (sy -> sy_name, id) == 0)
        !          1485:            return sy -> sy_type;
        !          1486:     }
        !          1487: 
        !          1488:     return NULLYP;
        !          1489: }
        !          1490: 
        !          1491: /*  */
        !          1492: 
        !          1493: static  normalize (yp, id)
        !          1494: YP     *yp;
        !          1495: char   *id;
        !          1496: {
        !          1497:     int            i;
        !          1498:     register YP            y,
        !          1499:                    z;
        !          1500:     char    buffer[BUFSIZ];
        !          1501: 
        !          1502:     if ((y = *yp) == NULLYP || y -> yp_code == YP_IDEFINED)
        !          1503:        return;
        !          1504:     y -> yp_id = NULLCP;
        !          1505:     y -> yp_flags &= ~YP_ID;
        !          1506: 
        !          1507:     (void) sprintf (buffer, "Pseudo-%s", id);
        !          1508:     for (i = 1; lookup_type (mymodule, buffer); i++)
        !          1509:        (void) sprintf (buffer, "Pseudo-%s-%d", id, i);
        !          1510: 
        !          1511:     z = new_type (YP_IDEFINED);
        !          1512:     z -> yp_identifier = new_string (buffer);
        !          1513:     *yp = z;
        !          1514: 
        !          1515:     pass1_type (yyencpref, yydecpref, yyprfpref, mymodule, new_string (buffer),
        !          1516:            y);
        !          1517: }
        !          1518: 
        !          1519: /*    VALUE HANDLING */
        !          1520: 
        !          1521: static int  val2int (yv)
        !          1522: register YV    yv;
        !          1523: {
        !          1524:     switch (yv -> yv_code) {
        !          1525:        case YV_BOOL:
        !          1526:        case YV_NUMBER:
        !          1527:            return yv -> yv_number;
        !          1528: 
        !          1529:        case YV_STRING:
        !          1530:            yyerror ("need an integer, not a string");
        !          1531: 
        !          1532:        case YV_IDEFINED:
        !          1533:        case YV_IDLIST:
        !          1534:            yyerror ("haven't written symbol table for values yet");
        !          1535: 
        !          1536:        case YV_VALIST:
        !          1537:            yyerror ("need an integer, not a list of values");
        !          1538: 
        !          1539:        case YV_NULL:
        !          1540:            yyerror ("need an integer, not NULL");
        !          1541: 
        !          1542:        case YV_REAL:
        !          1543:            yyerror ("need and integer, not a REAL");
        !          1544: 
        !          1545:        default:
        !          1546:            myyerror ("unknown value: %d", yv -> yv_code);
        !          1547:     }
        !          1548: /* NOTREACHED */
        !          1549: }
        !          1550: 
        !          1551: /*  */
        !          1552: 
        !          1553: static val2prf (yv, level)
        !          1554: register YV    yv;
        !          1555: int    level;
        !          1556: {
        !          1557:     register YV    y;
        !          1558: 
        !          1559:     if (yv -> yv_flags & YV_ID)
        !          1560:        printf ("%s ", yv -> yv_id);
        !          1561: 
        !          1562:     if (yv -> yv_flags & YV_TYPE)      /* will this REALLY work??? */
        !          1563:        do_type (yv -> yv_type, level, NULLCP);
        !          1564: 
        !          1565:     switch (yv -> yv_code) {
        !          1566:        case YV_BOOL: 
        !          1567:            printf (yv -> yv_number ? "TRUE" : "FALSE");
        !          1568:            break;
        !          1569: 
        !          1570:        case YV_NUMBER: 
        !          1571:            if (yv -> yv_named)
        !          1572:                printf ("%s", yv -> yv_named);
        !          1573:            else
        !          1574:                printf ("%d", yv -> yv_number);
        !          1575:            break;
        !          1576: 
        !          1577:        case YV_STRING: 
        !          1578:            printf ("\"%s\"", yv -> yv_string);
        !          1579:            break;
        !          1580: 
        !          1581:        case YV_IDEFINED: 
        !          1582:            if (yv -> yv_module)
        !          1583:                printf ("%s.", yv -> yv_module);
        !          1584:            printf ("%s", yv -> yv_identifier);
        !          1585:            break;
        !          1586: 
        !          1587:        case YV_IDLIST: 
        !          1588:        case YV_VALIST: 
        !          1589:            printf ("{");
        !          1590:            for (y = yv -> yv_idlist; y; y = y -> yv_next) {
        !          1591:                printf (" ");
        !          1592:                val2prf (y, level + 1);
        !          1593:                printf (y -> yv_next ? ", " : " ");
        !          1594:            }
        !          1595:            printf ("}");
        !          1596:            break;
        !          1597: 
        !          1598:        case YV_NULL: 
        !          1599:            printf ("NULL");
        !          1600:            break;
        !          1601: 
        !          1602:        case YV_REAL:
        !          1603:            dump_real (yv -> yv_real);
        !          1604:            break;
        !          1605: 
        !          1606:        default: 
        !          1607:            myyerror ("unknown value: %d", yv -> yv_code);
        !          1608:        /* NOTREACHED */
        !          1609:     }
        !          1610: }
        !          1611: 
        !          1612: static dump_real (r)
        !          1613: double  r;
        !          1614: {
        !          1615: #ifndef        BSD44
        !          1616:        extern char *ecvt ();
        !          1617:        char    *cp;
        !          1618:        char    sbuf[128];
        !          1619:        int     decpt, sign;
        !          1620: 
        !          1621:        cp = ecvt (r, 20, &decpt, &sign);
        !          1622:        (void) strcpy (sbuf, cp);       /* cp gets overwritten by printf */
        !          1623:        printf ("{ %s%s, 10, %d }", sign ? "-" : "", sbuf,
        !          1624:                decpt - strlen (sbuf));
        !          1625: #else
        !          1626:     register char   *cp,
        !          1627:                    *dp,
        !          1628:                    *sp;
        !          1629:     char    sbuf[128];
        !          1630: 
        !          1631:     (void) sprintf (sbuf, "%.19e", r);
        !          1632:     if (*(dp = sbuf) == '-')
        !          1633:        sp = "-", dp++;
        !          1634:     else
        !          1635:        sp = "";
        !          1636:     
        !          1637:     if (dp[1] != '.' || (cp = index (dp, 'e')) == NULL) {
        !          1638:        printf ("{ 0, 10, 0 } -- %s --", sbuf);
        !          1639:        return;
        !          1640:     }
        !          1641:     *cp++ = NULL;
        !          1642:     printf ("{ %s%c%s, 10, %d }",
        !          1643:            sp, *dp, dp + 2, atoi (cp) - strlen (dp + 2));
        !          1644: #endif
        !          1645: }
        !          1646: 
        !          1647: 
        !          1648: /*    ACTION HANDLING */
        !          1649: 
        !          1650: static act2prf (cp, level, e1, e2)
        !          1651: char   *cp,
        !          1652:        *e1,
        !          1653:        *e2;
        !          1654: int    level;
        !          1655: {
        !          1656:     register int    i,
        !          1657:                     j,
        !          1658:                     l4;
        !          1659:     register char  *dp,
        !          1660:                    *ep,
        !          1661:                    *fp;
        !          1662:     char   *gp;
        !          1663: 
        !          1664:     if (e1)
        !          1665:        printf (e1, level * 4, "");
        !          1666: 
        !          1667:     if (!(ep = index (dp = cp, '\n'))) {
        !          1668:        printf ("%s", dp);
        !          1669:        goto out;
        !          1670:     }
        !          1671: 
        !          1672:     for (;;) {
        !          1673:        i = expand (dp, ep, &gp);
        !          1674:        if (gp) {
        !          1675:            if (i == 0)
        !          1676:                printf ("%*.*s\n", ep - dp, ep - dp, dp);
        !          1677:            else
        !          1678:                break;
        !          1679:        }
        !          1680: 
        !          1681:        if (!(ep = index (dp = ep + 1, '\n'))) {
        !          1682:            printf ("%s", dp);
        !          1683:            return;
        !          1684:        }
        !          1685:     }
        !          1686: 
        !          1687: 
        !          1688:     printf ("\n");
        !          1689:     l4 = (level + 1) * 4;
        !          1690:     for (; *dp; dp = fp) {
        !          1691:        if (ep = index (dp, '\n'))
        !          1692:            fp = ep + 1;
        !          1693:        else
        !          1694:            fp = ep = dp + strlen (dp);
        !          1695: 
        !          1696:        j = expand (dp, ep, &gp);
        !          1697:        if (gp == NULL) {
        !          1698:            if (*fp)
        !          1699:                printf ("\n");
        !          1700:            continue;
        !          1701:        }
        !          1702: 
        !          1703:        if (j < i)
        !          1704:            j = i;
        !          1705:        if (j)
        !          1706:            printf ("%*s", l4 + j - i, "");
        !          1707:        printf ("%*.*s\n", ep - gp, ep - gp, gp);
        !          1708:     }
        !          1709: 
        !          1710:     printf ("%*s", level * 4, "");
        !          1711: out: ;
        !          1712:     if (e2)
        !          1713:        printf (e2, level * 4, "");
        !          1714: }
        !          1715: 
        !          1716: 
        !          1717: static expand (dp, ep, gp)
        !          1718: register char  *dp,
        !          1719:               *ep;
        !          1720: char  **gp;
        !          1721: {
        !          1722:     register int    i;
        !          1723: 
        !          1724:     *gp = NULL;
        !          1725:     for (i = 0; dp < ep; dp++) {
        !          1726:        switch (*dp) {
        !          1727:            case ' ': 
        !          1728:                i++;
        !          1729:                continue;
        !          1730: 
        !          1731:            case '\t': 
        !          1732:                i += 8 - (i % 8);
        !          1733:                continue;
        !          1734: 
        !          1735:            default: 
        !          1736:                *gp = dp;
        !          1737:                break;
        !          1738:        }
        !          1739:        break;
        !          1740:     }
        !          1741: 
        !          1742:     return i;
        !          1743: }
        !          1744: 
        !          1745: /*    DEBUG */
        !          1746: 
        !          1747: static print_op (yo, level)
        !          1748: register YO    yo;
        !          1749: register int   level;
        !          1750: {
        !          1751:     if (yo == NULLYO)
        !          1752:        return;
        !          1753: 
        !          1754:     fprintf (stderr, "%*sname=%s opcode=%d\n", level * 4, "",
        !          1755:            yo -> yo_name, yo -> yo_opcode);
        !          1756: 
        !          1757:     if (yo -> yo_arg) {
        !          1758:        fprintf (stderr, "%*sargument\n", level * 4, "");
        !          1759:        print_type (yo -> yo_arg, level + 1);
        !          1760:     }
        !          1761:     if (yo -> yo_result) {
        !          1762:        fprintf (stderr, "%*sresult\n", level * 4, "");
        !          1763:        print_type (yo -> yo_result, level + 1);
        !          1764:     }
        !          1765:     if (yo -> yo_errors) {
        !          1766:        fprintf (stderr, "%*serrors\n", level * 4, "");
        !          1767:        print_value (yo -> yo_errors, level + 1);
        !          1768:     }
        !          1769: }
        !          1770: 
        !          1771: /*  */
        !          1772: 
        !          1773: static print_err (ye, level)
        !          1774: register YE    ye;
        !          1775: register int   level;
        !          1776: {
        !          1777:     if (ye == NULLYE)
        !          1778:        return;
        !          1779: 
        !          1780:     fprintf (stderr, "%*sname=%s opcode=%d\n", level * 4, "",
        !          1781:            ye -> ye_name, ye -> ye_errcode);
        !          1782: 
        !          1783:     if (ye -> ye_param) {
        !          1784:        fprintf (stderr, "%*sparameter\n", level * 4, "");
        !          1785:        print_type (ye -> ye_param, level + 1);
        !          1786:     }
        !          1787: }
        !          1788: 
        !          1789: /*  */
        !          1790: 
        !          1791: print_type (yp, level)
        !          1792: register YP    yp;
        !          1793: register int   level;
        !          1794: {
        !          1795:     register YP            y;
        !          1796:     register YV            yv;
        !          1797: 
        !          1798:     if (yp == NULLYP)
        !          1799:        return;
        !          1800: 
        !          1801:     fprintf (stderr, "%*scode=0x%x flags=%s direction=0x%x\n", level * 4, "",
        !          1802:            yp -> yp_code, sprintb (yp -> yp_flags, YPBITS),
        !          1803:            yp -> yp_direction);
        !          1804:     fprintf (stderr,
        !          1805:            "%*sintexp=\"%s\" strexp=\"%s\" prfexp=0%o declexp=\"%s\" varexp=\"%s\"\n",
        !          1806:            level * 4, "", yp -> yp_intexp, yp -> yp_strexp, yp -> yp_prfexp,
        !          1807:            yp -> yp_declexp, yp -> yp_varexp);
        !          1808:     if (yp -> yp_param_type)
        !          1809:        fprintf (stderr, "%*sparameter type=\"%s\"\n", level * 4, "",
        !          1810:                 yp -> yp_param_type);
        !          1811:     if (yp -> yp_action0)
        !          1812:        fprintf (stderr, "%*saction0 at line %d=\"%s\"\n", level * 4, "",
        !          1813:                yp -> yp_act0_lineno, yp -> yp_action0);
        !          1814:     if (yp -> yp_action05)
        !          1815:        fprintf (stderr, "%*saction05 at line %d=\"%s\"\n", level * 4, "",
        !          1816:                yp -> yp_act05_lineno, yp -> yp_action05);
        !          1817:     if (yp -> yp_action1)
        !          1818:        fprintf (stderr, "%*saction1 at line %d=\"%s\"\n", level * 4, "",
        !          1819:                yp -> yp_act1_lineno, yp -> yp_action1);
        !          1820:     if (yp -> yp_action2)
        !          1821:        fprintf (stderr, "%*saction2 at line %d=\"%s\"\n", level * 4, "",
        !          1822:                yp -> yp_act2_lineno, yp -> yp_action2);
        !          1823:     if (yp -> yp_action3)
        !          1824:        fprintf (stderr, "%*saction3 at line %d=\"%s\"\n", level * 4, "",
        !          1825:                yp -> yp_act3_lineno, yp -> yp_action3);
        !          1826: 
        !          1827:     if (yp -> yp_flags & YP_TAG) {
        !          1828:        fprintf (stderr, "%*stag class=0x%x value=0x%x\n", level * 4, "",
        !          1829:                yp -> yp_tag -> yt_class, yp -> yp_tag -> yt_value);
        !          1830:        print_value (yp -> yp_tag -> yt_value, level + 1);
        !          1831:     }
        !          1832: 
        !          1833:     if (yp -> yp_flags & YP_DEFAULT) {
        !          1834:        fprintf (stderr, "%*sdefault=0x%x\n", level * 4, "", yp -> yp_default);
        !          1835:        print_value (yp -> yp_default, level + 1);
        !          1836:     }
        !          1837: 
        !          1838:     if (yp -> yp_flags & YP_ID)
        !          1839:        fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yp -> yp_id);
        !          1840: 
        !          1841:     if (yp -> yp_flags & YP_BOUND)
        !          1842:        fprintf (stderr, "%*sbound=\"%s\"\n", level * 4, "", yp -> yp_bound);
        !          1843: 
        !          1844:     if (yp -> yp_offset)
        !          1845:        fprintf (stderr, "%*soffset=\"%s\"\n", level * 4, "", yp -> yp_offset);
        !          1846: 
        !          1847:     switch (yp -> yp_code) {
        !          1848:        case YP_INTLIST:
        !          1849:        case YP_ENUMLIST:
        !          1850:        case YP_BITLIST:
        !          1851:            fprintf (stderr, "%*svalue=0x%x\n", level * 4, "", yp -> yp_value);
        !          1852:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !          1853:                print_value (yv, level + 1);
        !          1854:                fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          1855:            }
        !          1856:            break;
        !          1857: 
        !          1858:        case YP_SEQTYPE:
        !          1859:        case YP_SEQLIST:
        !          1860:        case YP_SETTYPE:
        !          1861:        case YP_SETLIST:
        !          1862:        case YP_CHOICE:
        !          1863:            fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yp -> yp_type);
        !          1864:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1865:                print_type (y, level + 1);
        !          1866:                fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          1867:            }
        !          1868:            break;
        !          1869: 
        !          1870:        case YP_IDEFINED:
        !          1871:            fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
        !          1872:                    level * 4, "", yp -> yp_module ? yp -> yp_module : "",
        !          1873:                    yp -> yp_identifier);
        !          1874:            break;
        !          1875: 
        !          1876:        default:
        !          1877:            break;
        !          1878:     }
        !          1879: }
        !          1880: 
        !          1881: /*  */
        !          1882: 
        !          1883: static print_value (yv, level)
        !          1884: register YV    yv;
        !          1885: register int   level;
        !          1886: {
        !          1887:     register YV            y;
        !          1888: 
        !          1889:     if (yv == NULLYV)
        !          1890:        return;
        !          1891: 
        !          1892:     fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
        !          1893:            yv -> yv_code, sprintb (yv -> yv_flags, YVBITS));
        !          1894: 
        !          1895:     if (yv -> yv_action)
        !          1896:        fprintf (stderr, "%*saction at line %d=\"%s\"\n", level * 4, "",
        !          1897:                yv -> yv_act_lineno, yv -> yv_action);
        !          1898: 
        !          1899:     if (yv -> yv_flags & YV_ID)
        !          1900:        fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yv -> yv_id);
        !          1901: 
        !          1902:     if (yv -> yv_flags & YV_NAMED)
        !          1903:        fprintf (stderr, "%*snamed=\"%s\"\n", level * 4, "", yv -> yv_named);
        !          1904: 
        !          1905:     if (yv -> yv_flags & YV_TYPE) {
        !          1906:        fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yv -> yv_type);
        !          1907:        print_type (yv -> yv_type, level + 1);
        !          1908:     }
        !          1909: 
        !          1910:     switch (yv -> yv_code) {
        !          1911:        case YV_NUMBER:
        !          1912:        case YV_BOOL:
        !          1913:            fprintf (stderr, "%*snumber=0x%x\n", level * 4, "",
        !          1914:                    yv -> yv_number);
        !          1915:            break;
        !          1916: 
        !          1917:        case YV_STRING:
        !          1918:            fprintf (stderr, "%*sstring=0x%x\n", level * 4, "",
        !          1919:                    yv -> yv_string);
        !          1920:            break;
        !          1921: 
        !          1922:        case YV_IDEFINED:
        !          1923:            if (yv -> yv_flags & YV_BOUND)
        !          1924:                fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
        !          1925:                        level * 4, "", yv -> yv_module, yv -> yv_identifier);
        !          1926:            else
        !          1927:                fprintf (stderr, "%*sbound identifier=\"%s\"\n",
        !          1928:                        level * 4, "", yv -> yv_identifier);
        !          1929:            break;
        !          1930: 
        !          1931:        case YV_IDLIST:
        !          1932:        case YV_VALIST:
        !          1933:            for (y = yv -> yv_idlist; y; y = y -> yv_next) {
        !          1934:                print_value (y, level + 1);
        !          1935:                fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          1936:            }
        !          1937:            break;
        !          1938: 
        !          1939:        default:
        !          1940:            break;
        !          1941:     }
        !          1942: }
        !          1943: 
        !          1944: /*    SYMBOLS */
        !          1945: 
        !          1946: static SY  new_symbol (encpref, decpref, prfpref, mod, id)
        !          1947: register char  *encpref,
        !          1948:               *decpref,
        !          1949:               *prfpref,
        !          1950:               *mod,
        !          1951:               *id;
        !          1952: {
        !          1953:     register SY    sy;
        !          1954: 
        !          1955:     if ((sy = (SY) calloc (1, sizeof *sy)) == NULLSY)
        !          1956:        yyerror ("out of memory");
        !          1957:     sy -> sy_encpref = encpref;
        !          1958:     sy -> sy_decpref = decpref;
        !          1959:     sy -> sy_prfpref = prfpref;
        !          1960:     sy -> sy_module = mod;
        !          1961:     sy -> sy_name = id;
        !          1962: 
        !          1963:     return sy;
        !          1964: }
        !          1965: 
        !          1966: 
        !          1967: static SY  add_symbol (s1, s2)
        !          1968: register SY    s1,
        !          1969:                s2;
        !          1970: {
        !          1971:     register SY            sy;
        !          1972: 
        !          1973:     if (s1 == NULLSY)
        !          1974:        return s2;
        !          1975: 
        !          1976:     for (sy = s1; sy -> sy_next; sy = sy -> sy_next)
        !          1977:        continue;
        !          1978:     sy -> sy_next = s2;
        !          1979: 
        !          1980:     return s1;
        !          1981: }
        !          1982: 
        !          1983: /*    TYPES */
        !          1984: 
        !          1985: YP     new_type (code)
        !          1986: int    code;
        !          1987: {
        !          1988:     register YP    yp;
        !          1989: 
        !          1990:     if ((yp = (YP) calloc (1, sizeof *yp)) == NULLYP)
        !          1991:        yyerror ("out of memory");
        !          1992:     yp -> yp_code = code;
        !          1993: 
        !          1994:     return yp;
        !          1995: }
        !          1996: 
        !          1997: 
        !          1998: YP     add_type (y, z)
        !          1999: register YP    y,
        !          2000:                z;
        !          2001: {
        !          2002:     register YP            yp;
        !          2003: 
        !          2004:     for (yp = y; yp -> yp_next; yp = yp -> yp_next)
        !          2005:        continue;
        !          2006:     yp -> yp_next = z;
        !          2007: 
        !          2008:     return y;
        !          2009: }
        !          2010: 
        !          2011: /*    VALUES */
        !          2012: 
        !          2013: YV     new_value (code)
        !          2014: int    code;
        !          2015: {
        !          2016:     register YV    yv;
        !          2017: 
        !          2018:     if ((yv = (YV) calloc (1, sizeof *yv)) == NULLYV)
        !          2019:        yyerror ("out of memory");
        !          2020:     yv -> yv_code = code;
        !          2021: 
        !          2022:     return yv;
        !          2023: }
        !          2024: 
        !          2025: 
        !          2026: YV     add_value (y, z)
        !          2027: register YV    y,
        !          2028:                z;
        !          2029: {
        !          2030:     register YV            yv;
        !          2031: 
        !          2032:     for (yv = y; yv -> yv_next; yv = yv -> yv_next)
        !          2033:        continue;
        !          2034:     yv -> yv_next = z;
        !          2035: 
        !          2036:     return y;
        !          2037: }
        !          2038: 
        !          2039: /*    TAGS */
        !          2040: 
        !          2041: YT     new_tag (class)
        !          2042: PElementClass  class;
        !          2043: {
        !          2044:     register YT    yt;
        !          2045: 
        !          2046:     if ((yt = (YT) calloc (1, sizeof *yt)) == NULLYT)
        !          2047:        yyerror ("out of memory");
        !          2048:     yt -> yt_class = class;
        !          2049: 
        !          2050:     return yt;
        !          2051: }
        !          2052: 
        !          2053: /*    STRINGS */
        !          2054: 
        !          2055: char   *new_string (s)
        !          2056: register char  *s;
        !          2057: {
        !          2058:     register char  *p;
        !          2059: 
        !          2060:     if ((p = malloc ((unsigned) (strlen (s) + 1))) == NULLCP)
        !          2061:        yyerror ("out of memory");
        !          2062: 
        !          2063:     (void) strcpy (p, s);
        !          2064:     return p;
        !          2065: }
        !          2066: 
        !          2067: /*    SYMBOLS */
        !          2068: 
        !          2069: static struct triple {
        !          2070:     char          *t_name;
        !          2071:     PElementClass   t_class;
        !          2072:     PElementID     t_id;
        !          2073: }              triples[] = {
        !          2074:     "IA5String", PE_CLASS_UNIV,        PE_DEFN_IA5S,
        !          2075:     "ISO646String", PE_CLASS_UNIV, PE_DEFN_IA5S,
        !          2076:     "NumericString", PE_CLASS_UNIV, PE_DEFN_NUMS,
        !          2077:     "PrintableString", PE_CLASS_UNIV, PE_DEFN_PRTS,
        !          2078:     "T61String", PE_CLASS_UNIV, PE_DEFN_T61S,
        !          2079:     "TeletexString", PE_CLASS_UNIV, PE_DEFN_T61S,
        !          2080:     "VideotexString", PE_CLASS_UNIV, PE_DEFN_VTXS,
        !          2081:     "GeneralizedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
        !          2082:     "GeneralisedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
        !          2083:     "UTCTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
        !          2084:     "UniversalTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
        !          2085:     "GraphicString", PE_CLASS_UNIV, PE_DEFN_GFXS,
        !          2086:     "VisibleString", PE_CLASS_UNIV, PE_DEFN_VISS,
        !          2087:     "GeneralString", PE_CLASS_UNIV, PE_DEFN_GENS,
        !          2088:     "EXTERNAL", PE_CLASS_UNIV, PE_CONS_EXTN,
        !          2089:     "ObjectDescriptor", PE_CLASS_UNIV, PE_PRIM_ODE,
        !          2090: 
        !          2091:     NULL
        !          2092: };
        !          2093: 
        !          2094: /*  */
        !          2095: 
        !          2096: static char *modsym (module, id, prefix)
        !          2097: register char  *module,
        !          2098:               *id;
        !          2099: char   *prefix;
        !          2100: {
        !          2101:     char    buf1[BUFSIZ],
        !          2102:             buf2[BUFSIZ],
        !          2103:             buf3[BUFSIZ];
        !          2104:     register struct triple *t;
        !          2105:     static char buffer[BUFSIZ];
        !          2106: 
        !          2107:     if (module == NULLCP)
        !          2108:        for (t = triples; t -> t_name; t++)
        !          2109:            if (strcmp (t -> t_name, id) == 0) {
        !          2110:                module = "UNIV";
        !          2111:                break;
        !          2112:            }
        !          2113: 
        !          2114:     if (prefix)
        !          2115:        modsym_aux (prefix, buf1);
        !          2116:     modsym_aux (module ? module : mymodule, buf2);
        !          2117:     modsym_aux (id, buf3);
        !          2118:     if (prefix)
        !          2119:        (void) sprintf (buffer, "%s_%s_%s", buf1, buf2, buf3);
        !          2120:     else
        !          2121:        (void) sprintf (buffer, "%s_%s", buf2, buf3);
        !          2122: 
        !          2123:     return buffer;
        !          2124: }
        !          2125: 
        !          2126: 
        !          2127: /*
        !          2128:  * we do the same as modsym except we generate a more "compress" name,
        !          2129:  * no underscores between components and dash is translated to only one
        !          2130:  * underscore to be compatiable with pepsy. Hence name Compress MODule SYMbol
        !          2131:  */
        !          2132: static char *cmodsym (module, id, prefix)
        !          2133: register char  *module,
        !          2134:               *id;
        !          2135: char   *prefix;
        !          2136: {
        !          2137:     char    buf1[BUFSIZ],
        !          2138:             buf2[BUFSIZ],
        !          2139:             buf3[BUFSIZ];
        !          2140:     register struct triple *t;
        !          2141:     static char buffer[BUFSIZ];
        !          2142: 
        !          2143:     if (module == NULLCP)
        !          2144:        for (t = triples; t -> t_name; t++)
        !          2145:            if (strcmp (t -> t_name, id) == 0) {
        !          2146:                module = "UNIV";
        !          2147:                break;
        !          2148:            }
        !          2149: 
        !          2150:     if (prefix)
        !          2151:        cmodsym_aux (prefix, buf1);
        !          2152:     cmodsym_aux (module ? module : mymodule, buf2);
        !          2153:     cmodsym_aux (id, buf3);
        !          2154:     if (prefix)
        !          2155:        (void) sprintf (buffer, "%s%s%s", buf1, buf2, buf3);
        !          2156:     else
        !          2157:        (void) sprintf (buffer, "%s%s", buf2, buf3);
        !          2158: 
        !          2159:     return buffer;
        !          2160: }
        !          2161: 
        !          2162: 
        !          2163: /* like cmodsym except we put identifier (sym) then the module (mod) hence its
        !          2164:  * name symmod
        !          2165:  */
        !          2166: static char *csymmod (module, id, prefix)
        !          2167: register char  *module,
        !          2168:               *id;
        !          2169: char   *prefix;
        !          2170: {
        !          2171:     char    buf1[BUFSIZ],
        !          2172:             buf2[BUFSIZ],
        !          2173:             buf3[BUFSIZ];
        !          2174:     register struct triple *t;
        !          2175:     static char buffer[BUFSIZ];
        !          2176: 
        !          2177:     if (module == NULLCP)
        !          2178:        for (t = triples; t -> t_name; t++)
        !          2179:            if (strcmp (t -> t_name, id) == 0) {
        !          2180:                module = "UNIV";
        !          2181:                break;
        !          2182:            }
        !          2183: 
        !          2184:     if (prefix)
        !          2185:        cmodsym_aux (prefix, buf1);
        !          2186:     cmodsym_aux (id, buf2);
        !          2187:     cmodsym_aux (module ? module : mymodule, buf3);
        !          2188:     if (prefix)
        !          2189:        (void) sprintf (buffer, "%s%s%s", buf1, buf2, buf3);
        !          2190:     else
        !          2191:        (void) sprintf (buffer, "%s%s", buf2, buf3);
        !          2192: 
        !          2193:     return buffer;
        !          2194: }
        !          2195: 
        !          2196: static modsym_aux (name, bp)
        !          2197: register char  *name,
        !          2198:               *bp;
        !          2199: {
        !          2200:     register char   c;
        !          2201: 
        !          2202:     while (c = *name++)
        !          2203:        switch (c) {
        !          2204:            case '-':
        !          2205:                *bp++ = '_';
        !          2206:                *bp++ = '_';
        !          2207:                break;
        !          2208: 
        !          2209:            default:
        !          2210:                *bp++ = c;
        !          2211:                break;
        !          2212:        }
        !          2213: 
        !          2214:     *bp = NULL;
        !          2215: }
        !          2216: 
        !          2217: static cmodsym_aux (name, bp)
        !          2218: register char  *name,
        !          2219:               *bp;
        !          2220: {
        !          2221:     register char   c;
        !          2222: 
        !          2223:     while (c = *name++)
        !          2224:        switch (c) {
        !          2225:            case '-':
        !          2226:                *bp++ = '_';
        !          2227:                break;
        !          2228: 
        !          2229:            default:
        !          2230:                *bp++ = c;
        !          2231:                break;
        !          2232:        }
        !          2233: 
        !          2234:     *bp = NULL;
        !          2235: }

unix.superglobalmegacorp.com

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