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

1.1     ! root        1: /* mosy.c - Managed Object Syntax-compiler (yacc-based) */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/others/mosy/RCS/mosy.c,v 7.1 90/07/01 21:04:36 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/others/mosy/RCS/mosy.c,v 7.1 90/07/01 21:04:36 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       mosy.c,v $
        !            12:  * Revision 7.1  90/07/01  21:04:36  mrose
        !            13:  * pepsy
        !            14:  * 
        !            15:  * Revision 7.0  89/11/23  22:00:38  mrose
        !            16:  * Release 6.0
        !            17:  * 
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  *                               NOTICE
        !            22:  *
        !            23:  *    Acquisition, use, and distribution of this module and related
        !            24:  *    materials are subject to the restrictions of a license agreement.
        !            25:  *    Consult the Preface in the User's Manual for the full terms of
        !            26:  *    this agreement.
        !            27:  *
        !            28:  */
        !            29: 
        !            30: 
        !            31: #include <ctype.h>
        !            32: #include <stdio.h>
        !            33: #include <varargs.h>
        !            34: #include "mosy-defs.h"
        !            35: 
        !            36: /*    DATA */
        !            37: 
        !            38: int    Cflag = 0;              /* mosy */
        !            39: int    dflag = 0;
        !            40: int    Pflag = 0;              /* pepy compat... */
        !            41: int    doexternals;
        !            42: static int linepos = 0;
        !            43: static int mflag = 0;
        !            44: static int mosydebug = 0;
        !            45: static int sflag = 0;
        !            46: 
        !            47: static  char *eval = NULLCP;
        !            48: 
        !            49: char   *mymodule = "";
        !            50: OID    mymoduleid;
        !            51: 
        !            52: int yysection = NULL;
        !            53: char *yyencpref = "none";
        !            54: char *yydecpref = "none";
        !            55: char *yyprfpref = "none";
        !            56: char *yyencdflt = "none";
        !            57: char *yydecdflt = "none";
        !            58: char *yyprfdflt = "none";
        !            59: 
        !            60: static char *yymode = "";
        !            61: 
        !            62: static char *classes[] = {
        !            63:     "UNIVERSAL ",
        !            64:     "APPLICATION ",
        !            65:     "",
        !            66:     "PRIVATE "
        !            67: };
        !            68: 
        !            69: static char autogen[BUFSIZ];
        !            70: 
        !            71: char *sysin = NULLCP;
        !            72: static char sysout[BUFSIZ];
        !            73: 
        !            74: /*  */
        !            75: 
        !            76: typedef struct yot {
        !            77:     char   *yo_name;
        !            78: 
        !            79:     YP     yo_syntax;
        !            80:     YV     yo_value;
        !            81: 
        !            82:     char   *yo_access;
        !            83:     char   *yo_status;
        !            84: }              yot, *OT;
        !            85: #define        NULLOT  ((OT) 0)
        !            86: 
        !            87: typedef struct yoi {
        !            88:     char   *yi_name;
        !            89: 
        !            90:     YV     yi_value;
        !            91: }              yoi, *OI;
        !            92: #define        NULLOI  ((OI) 0)
        !            93: 
        !            94: /*  */
        !            95: 
        !            96: typedef struct symlist {
        !            97:     char   *sy_encpref;
        !            98:     char   *sy_decpref;
        !            99:     char   *sy_prfpref;
        !           100:     char   *sy_module;
        !           101:     char   *sy_name;
        !           102: 
        !           103:     union {
        !           104:        OT      sy_un_yo;
        !           105: 
        !           106:        OI      sy_un_yi;
        !           107: 
        !           108:        YP      sy_un_yp;
        !           109:     }  sy_un;
        !           110: #define        sy_yo   sy_un.sy_un_yo
        !           111: #define        sy_yi   sy_un.sy_un_yi
        !           112: #define        sy_yp   sy_un.sy_un_yp
        !           113: 
        !           114:     struct symlist *sy_next;
        !           115: }              symlist, *SY;
        !           116: #define        NULLSY  ((SY) 0)
        !           117: 
        !           118: static SY      myobjects = NULLSY;
        !           119: 
        !           120: static SY      myidentifiers = NULLSY;
        !           121: 
        !           122: static SY      mytypes = NULLSY;
        !           123: 
        !           124: 
        !           125: char   *modsym ();
        !           126: SY     new_symbol (), add_symbol ();
        !           127: 
        !           128: char   *id2str ();
        !           129: 
        !           130: YP     lookup_type ();
        !           131: char   *val2str ();
        !           132: 
        !           133: /*    MAIN */
        !           134: 
        !           135: /* ARGSUSED */
        !           136: 
        !           137: main (argc, argv, envp)
        !           138: int    argc;
        !           139: char  **argv,
        !           140:       **envp;
        !           141: {
        !           142:     register char  *cp,
        !           143:                   *sp;
        !           144: 
        !           145:     fprintf (stderr, "%s\n", mosyversion);
        !           146: 
        !           147:     sysout[0] = NULL;
        !           148:     for (argc--, argv++; argc > 0; argc--, argv++) {
        !           149:        cp = *argv;
        !           150: 
        !           151:        if (strcmp (cp, "-d") == 0) {
        !           152:            dflag++;
        !           153:            continue;
        !           154:        }
        !           155:        if (strcmp (cp, "-m") == 0) {
        !           156:            mflag++;
        !           157:            continue;
        !           158:        }
        !           159:        if (strcmp (cp, "-o") == 0) {
        !           160:            if (sysout[0]) {
        !           161:                fprintf (stderr, "too many output files\n");
        !           162:                exit (1);
        !           163:            }
        !           164:            argc--, argv++;
        !           165:            if ((cp = *argv) == NULL || (*cp == '-' && cp[1] != NULL))
        !           166:                goto usage;
        !           167:            (void) strcpy (sysout, cp);
        !           168: 
        !           169:            continue;
        !           170:        }
        !           171:        if (strcmp (cp, "-s") == 0) {
        !           172:            sflag++;
        !           173:            continue;
        !           174:        }
        !           175: 
        !           176:        if (sysin) {
        !           177: usage: ;
        !           178:            fprintf (stderr,
        !           179:                "usage: mosy [-d] [-o module.defs] [-s] module.my\n");
        !           180:            exit (1);
        !           181:        }
        !           182: 
        !           183:        if (*cp == '-') {
        !           184:            if (*++cp != NULL)
        !           185:                goto usage;
        !           186:            sysin = "";
        !           187:        }
        !           188:        sysin = cp;
        !           189: 
        !           190:        if (sysout[0])
        !           191:            continue;
        !           192:        if (sp = rindex (cp, '/'))
        !           193:            sp++;
        !           194:        if (sp == NULL || *sp == NULL)
        !           195:            sp = cp;
        !           196:        sp += strlen (cp = sp) - 3;
        !           197:        if (sp > cp && strcmp (sp, ".my") == 0)
        !           198:            (void) sprintf (sysout, "%.*s.defs", sp - cp, cp);
        !           199:        else
        !           200:            (void) sprintf (sysout, "%s.defs", cp);
        !           201:     }
        !           202: 
        !           203:     switch (mosydebug = (cp = getenv ("MOSYTEST")) && *cp ? atoi (cp) : 0) {
        !           204:        case 2:
        !           205:            yydebug++;          /* fall */
        !           206:        case 1:
        !           207:            sflag++;            /*   .. */
        !           208:        case 0:
        !           209:            break;
        !           210:     }
        !           211: 
        !           212:     if (sysin == NULLCP)
        !           213:        sysin = "";
        !           214: 
        !           215:     if (*sysin && freopen (sysin, "r", stdin) == NULL) {
        !           216:        fprintf (stderr, "unable to read "), perror (sysin);
        !           217:        exit (1);
        !           218:     }
        !           219: 
        !           220:     if (strcmp (sysout, "-") == 0)
        !           221:        sysout[0] = NULL;
        !           222:     if (*sysout && freopen (sysout, "w", stdout) == NULL) {
        !           223:        fprintf (stderr, "unable to write "), perror (sysout);
        !           224:        exit (1);
        !           225:     }
        !           226: 
        !           227:     if (cp = index (mosyversion, ')'))
        !           228:        for (cp++; *cp != ' '; cp++)
        !           229:            if (*cp == NULL) {
        !           230:                cp = NULL;
        !           231:                break;
        !           232:            }
        !           233:     if (cp == NULL)
        !           234:        cp = mosyversion + strlen (mosyversion);
        !           235:     (void) sprintf (autogen, "%*.*s", 
        !           236:            cp - mosyversion, cp - mosyversion, mosyversion);
        !           237:     printf ("-- automatically generated by %s, do not edit!\n\n", autogen);
        !           238: 
        !           239:     initoidtbl ();
        !           240: 
        !           241:     exit (yyparse ());         /* NOTREACHED */
        !           242: }
        !           243: 
        !           244: /*    ERRORS */
        !           245: 
        !           246: yyerror (s)
        !           247: register char   *s;
        !           248: {
        !           249:     yyerror_aux (s);
        !           250: 
        !           251:     if (*sysout)
        !           252:        (void) unlink (sysout);
        !           253: 
        !           254:     exit (1);
        !           255: }
        !           256: 
        !           257: #ifndef lint
        !           258: warning (va_alist)
        !           259: va_dcl
        !           260: {
        !           261:     char       buffer[BUFSIZ];
        !           262:     char       buffer2[BUFSIZ];
        !           263:     char       *cp;
        !           264:     va_list    ap;
        !           265: 
        !           266:     va_start (ap);
        !           267: 
        !           268:     _asprintf (buffer, NULLCP, ap);
        !           269: 
        !           270:     va_end (ap);
        !           271: 
        !           272:     (void) sprintf (buffer2, "Warning: %s", buffer);
        !           273:     yyerror_aux (buffer2);
        !           274: }
        !           275: 
        !           276: #else
        !           277: 
        !           278: /* VARARGS1 */
        !           279: warning (fmt)
        !           280: char   *fmt;
        !           281: {
        !           282:     warning (fmt);
        !           283: }
        !           284: #endif
        !           285: 
        !           286: static yyerror_aux (s)
        !           287: register char   *s;
        !           288: {
        !           289:     if (linepos)
        !           290:        fprintf (stderr, "\n"), linepos = 0;
        !           291: 
        !           292:     if (eval)
        !           293:        fprintf (stderr, "%s %s: ", yymode, eval);
        !           294:     else
        !           295:        fprintf (stderr, "line %d: ", yylineno);
        !           296:     fprintf (stderr, "%s\n", s);
        !           297:     if (!eval)
        !           298:        fprintf (stderr, "last token read was \"%s\"\n", yytext);
        !           299: }
        !           300: 
        !           301: /*  */
        !           302: 
        !           303: #ifndef        lint
        !           304: myyerror (va_alist)
        !           305: va_dcl
        !           306: {
        !           307:     char    buffer[BUFSIZ];
        !           308:     va_list ap;
        !           309: 
        !           310:     va_start (ap);
        !           311: 
        !           312:     _asprintf (buffer, NULLCP, ap);
        !           313: 
        !           314:     va_end (ap);
        !           315: 
        !           316:     yyerror (buffer);
        !           317: }
        !           318: #else
        !           319: /* VARARGS */
        !           320: 
        !           321: myyerror (fmt)
        !           322: char   *fmt;
        !           323: {
        !           324:     myyerror (fmt);
        !           325: }
        !           326: #endif
        !           327: 
        !           328: /*  */
        !           329: 
        !           330: yywrap () {
        !           331:     if (linepos)
        !           332:        fprintf (stderr, "\n"), linepos = 0;
        !           333: 
        !           334:     return 1;
        !           335: }
        !           336: 
        !           337: /*  */
        !           338: 
        !           339: /* ARGSUSED */
        !           340: 
        !           341: yyprint (s, f, top)
        !           342: char   *s;
        !           343: int    f,
        !           344:        top;
        !           345: {
        !           346: }
        !           347: 
        !           348: static  yyprint_aux (s, mode)
        !           349: char   *s,
        !           350:        *mode;
        !           351: {
        !           352:     int            len;
        !           353:     static int nameoutput = 0;
        !           354:     static int outputlinelen = 79;
        !           355: 
        !           356:     if (sflag)
        !           357:        return;
        !           358: 
        !           359:     if (strcmp (yymode, mode)) {
        !           360:        if (linepos)
        !           361:            fprintf (stderr, "\n\n");
        !           362: 
        !           363:        fprintf (stderr, "%s", mymodule);
        !           364:        nameoutput = (linepos = strlen (mymodule)) + 1;
        !           365: 
        !           366:        fprintf (stderr, " %ss", yymode = mode);
        !           367:        linepos += strlen (yymode) + 1;
        !           368:        fprintf (stderr, ":");
        !           369:        linepos += 2;
        !           370:     }
        !           371: 
        !           372:     len = strlen (s);
        !           373:     if (linepos != nameoutput)
        !           374:        if (len + linepos + 1 > outputlinelen)
        !           375:            fprintf (stderr, "\n%*s", linepos = nameoutput, "");
        !           376:        else
        !           377:            fprintf (stderr, " "), linepos++;
        !           378:     fprintf (stderr, "%s", s);
        !           379:     linepos += len;
        !           380: }
        !           381: 
        !           382: /*    PASS1 */
        !           383: 
        !           384: pass1 ()
        !           385: {
        !           386:     printf ("-- object definitions compiled from %s", mymodule);
        !           387:     if (mymoduleid)
        !           388:        printf (" %s", oidprint(mymoduleid));
        !           389:     printf ("\n\n");
        !           390: }
        !           391: 
        !           392: /*  */
        !           393: 
        !           394: pass1_oid (mod, id, value)
        !           395: char   *mod,
        !           396:        *id;
        !           397: YV     value;
        !           398: {
        !           399:     register SY            sy;
        !           400:     register OI            yi;
        !           401: 
        !           402:     if ((yi = (OI) calloc (1, sizeof *yi)) == NULLOI)
        !           403:        yyerror ("out of memory");
        !           404: 
        !           405:     yi -> yi_name = id;
        !           406:     yi -> yi_value = value;
        !           407: 
        !           408:     if (mosydebug) {
        !           409:        if (linepos)
        !           410:            fprintf (stderr, "\n"), linepos = 0;
        !           411: 
        !           412:        fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
        !           413:        print_yi (yi, 0);
        !           414:        fprintf (stderr, "--------\n");
        !           415:     }
        !           416:     else
        !           417:        yyprint_aux (id, "identifier");
        !           418: 
        !           419:     sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id);
        !           420:     sy -> sy_yi = yi;
        !           421:     myidentifiers = add_symbol (myidentifiers, sy);
        !           422: }
        !           423: 
        !           424: /*  */
        !           425: 
        !           426: pass1_obj (mod, id, syntax, value, aname, sname)
        !           427: char   *mod,
        !           428:        *id,
        !           429:        *aname,
        !           430:        *sname;
        !           431: YP     syntax;
        !           432: YV     value;
        !           433: {
        !           434:     register SY            sy;
        !           435:     register OT            yo;
        !           436: 
        !           437:     if ((yo = (OT) calloc (1, sizeof *yo)) == NULLOT)
        !           438:        yyerror ("out of memory");
        !           439: 
        !           440:     yo -> yo_name = id;
        !           441:     yo -> yo_syntax = syntax;
        !           442:     yo -> yo_value = value;
        !           443:     yo -> yo_access = aname;
        !           444:     yo -> yo_status = sname;
        !           445: 
        !           446:     if (mosydebug) {
        !           447:        if (linepos)
        !           448:            fprintf (stderr, "\n"), linepos = 0;
        !           449: 
        !           450:        fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
        !           451:        print_yo (yo, 0);
        !           452:        fprintf (stderr, "--------\n");
        !           453:     }
        !           454:     else
        !           455:        yyprint_aux (id, "object");
        !           456: 
        !           457:     sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id);
        !           458:     sy -> sy_yo = yo;
        !           459:     myobjects = add_symbol (myobjects, sy);
        !           460: }
        !           461: 
        !           462: /*  */
        !           463: 
        !           464: pass1_type (encpref, decpref, prfpref, mod, id, yp)
        !           465: register char  *encpref,
        !           466:               *decpref,
        !           467:               *prfpref,
        !           468:               *mod,
        !           469:               *id;
        !           470: register YP    yp;
        !           471: {
        !           472:     register SY            sy;
        !           473: 
        !           474:     if (dflag && lookup_type (mod, id))        /* no duplicate entries, please... */
        !           475:        return;
        !           476: 
        !           477:     if (mosydebug) {
        !           478:        if (linepos)
        !           479:            fprintf (stderr, "\n"), linepos = 0;
        !           480: 
        !           481:        fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
        !           482:        print_type (yp, 0);
        !           483:        fprintf (stderr, "--------\n");
        !           484:     }
        !           485:     else
        !           486:        if (!(yp -> yp_flags & YP_IMPORTED))
        !           487:            yyprint_aux (id, "type");
        !           488: 
        !           489:     sy = new_symbol (encpref, decpref, prfpref, mod, id);
        !           490:     sy -> sy_yp = yp;
        !           491:     mytypes = add_symbol (mytypes, sy);
        !           492: }
        !           493: 
        !           494: /*    PASS2 */
        !           495: 
        !           496: pass2 () {
        !           497:     register SY            sy;
        !           498:     register YP            yp;
        !           499: 
        !           500:     if (!sflag)
        !           501:        (void) fflush (stderr);
        !           502: 
        !           503:     yymode = "identifiers";
        !           504:     for (sy = myidentifiers; sy; sy = sy -> sy_next) {
        !           505:        if (sy -> sy_module == NULLCP)
        !           506:            yyerror ("no module name associated with symbol");
        !           507: 
        !           508:        do_id (sy -> sy_yi, eval = sy -> sy_name);
        !           509:     }
        !           510:     if (myidentifiers)
        !           511:        printf ("\n");
        !           512: 
        !           513:     yymode = "objects";
        !           514:     for (sy = myobjects; sy; sy = sy -> sy_next) {
        !           515:        if (sy -> sy_module == NULLCP)
        !           516:            yyerror ("no module name associated with symbol");
        !           517: 
        !           518:        do_obj1 (sy -> sy_yo, eval = sy -> sy_name);
        !           519:     }
        !           520:     if (myobjects)
        !           521:        printf ("\n\n");
        !           522: 
        !           523:     (void) fflush (stdout);
        !           524: 
        !           525:     if (ferror (stdout))
        !           526:        myyerror ("write error - %s", sys_errname (errno));
        !           527: }
        !           528: 
        !           529: /*  */
        !           530: 
        !           531: /* ARGSUSED */
        !           532: 
        !           533: static do_id (yi, id)
        !           534: register OI    yi;
        !           535: char   *id;
        !           536: {
        !           537:     printf ("%-20s %s\n", yi -> yi_name, id2str (yi -> yi_value));
        !           538: }
        !           539: 
        !           540: /*  */
        !           541: 
        !           542: /* ARGSUSED */
        !           543: 
        !           544: static do_obj1 (yo, id)
        !           545: register OT    yo;
        !           546: char   *id;
        !           547: {
        !           548:     register YP            yp,
        !           549:                    yz;
        !           550: 
        !           551:     printf ("%-20s %-16s ", yo -> yo_name, id2str (yo -> yo_value));
        !           552: 
        !           553:     if ((yp = yo -> yo_syntax) == NULLYP)
        !           554:        yyerror ("no syntax associated with object type");
        !           555:     switch (yp -> yp_code) {
        !           556:        case YP_INT:
        !           557:        case YP_INTLIST:
        !           558:            id = "INTEGER";
        !           559:            break;
        !           560: 
        !           561:        case YP_OCT:
        !           562:            id = "OctetString";
        !           563:            break;
        !           564: 
        !           565:        case YP_OID:
        !           566:            id = "ObjectID";
        !           567:            break;
        !           568: 
        !           569:        case YP_NULL:
        !           570:            id = "NULL";
        !           571:            break;
        !           572: 
        !           573:        default:
        !           574: #ifdef notdef
        !           575:            yp = new_type (YP_IDEFINED);
        !           576:            yp -> yp_identifier = new_string (yo -> yo_name);
        !           577:            yp -> yp_identifier[0] = toupper (yp -> yp_identifier[0]);
        !           578:            if (lookup_type (mymodule, yp -> yp_identifier))
        !           579:                yyerror ("unable to create inline type for object's syntax");
        !           580:            pass1_type (yyencpref, yydecpref, yyprfpref, mymodule,
        !           581:                        new_string (yp -> yp_identifier),
        !           582:                        yo -> yo_syntax = yp);
        !           583: #endif
        !           584:            id = "Aggregate";
        !           585:            break;
        !           586: 
        !           587:        case YP_IDEFINED:
        !           588:            yz = lookup_type (yp -> yp_module, yp -> yp_identifier);
        !           589: again: ;
        !           590:            switch (yz ? yz -> yp_code : YP_UNDF) {
        !           591:                case YP_UNDF:
        !           592:                case YP_INT:
        !           593:                case YP_INTLIST:
        !           594:                case YP_OCT:
        !           595:                case YP_OID:
        !           596:                case YP_NULL:
        !           597:                    id = yp -> yp_identifier;
        !           598:                    break;
        !           599: 
        !           600:                case YP_IDEFINED:
        !           601:                    yz = lookup_type (yz -> yp_module, yz -> yp_identifier);
        !           602:                    goto again;
        !           603: 
        !           604:                default:
        !           605:                    id = "Aggregate";
        !           606:                    break;
        !           607:            }
        !           608:            break;
        !           609:     }
        !           610: 
        !           611:     printf ("%-15s %-15s %s\n", id, yo -> yo_access, yo -> yo_status);
        !           612: }
        !           613: 
        !           614: /*    IDENTIFIER HANDLING */
        !           615: 
        !           616: static char *id2str (yv)
        !           617: register YV    yv;
        !           618: {
        !           619:     register char *cp,
        !           620:                  *dp;
        !           621:     static char buffer[BUFSIZ];
        !           622: 
        !           623:     if (yv -> yv_code != YV_OIDLIST)
        !           624:        yyerror ("need an object identifer");
        !           625:        
        !           626:     cp = buffer;
        !           627:     for (yv = yv -> yv_idlist, dp = ""; yv; yv = yv -> yv_next, dp = ".") {
        !           628:        (void) sprintf (cp, "%s%s", dp, val2str (yv));
        !           629:        cp += strlen (cp);
        !           630:     }
        !           631:     *cp = NULL;
        !           632: 
        !           633:     return buffer;
        !           634: }
        !           635: 
        !           636: /*    TYPE HANDLING */
        !           637: 
        !           638: static YP  lookup_type (mod, id)
        !           639: register char *mod,
        !           640:              *id;
        !           641: {
        !           642:     register SY            sy;
        !           643: 
        !           644:     for (sy = mytypes; sy; sy = sy -> sy_next) {
        !           645:        if (mod) {
        !           646:            if (strcmp (sy -> sy_module, mod))
        !           647:                continue;
        !           648:        }
        !           649:        else
        !           650:            if (strcmp (sy -> sy_module, mymodule)
        !           651:                    && strcmp (sy -> sy_module, "UNIV"))
        !           652:                continue;
        !           653: 
        !           654:        if (strcmp (sy -> sy_name, id) == 0)
        !           655:            return sy -> sy_yp;
        !           656:     }
        !           657: 
        !           658:     return NULLYP;
        !           659: }
        !           660: 
        !           661: /*    VALUE HANDLING */
        !           662: 
        !           663: static char *val2str (yv)
        !           664: register YV    yv;
        !           665: {
        !           666:     static char buffer[BUFSIZ];
        !           667: 
        !           668:     switch (yv -> yv_code) {
        !           669:        case YV_BOOL:
        !           670:            yyerror ("need a sub-identifier, not a boolean");
        !           671: 
        !           672:        case YV_NUMBER:
        !           673:            (void) sprintf (buffer, "%d", yv -> yv_number);
        !           674:            return buffer;
        !           675: 
        !           676:        case YV_STRING:
        !           677:            yyerror ("need a sub-identifier, not a string");
        !           678: 
        !           679:        case YV_IDEFINED:
        !           680:            return yv -> yv_identifier;
        !           681: 
        !           682:        case YV_IDLIST:
        !           683:            yyerror ("haven't written symbol table for values yet");
        !           684: 
        !           685:        case YV_VALIST:
        !           686:            yyerror ("need a sub-identifier, not a list of values");
        !           687: 
        !           688:        case YV_OIDLIST:
        !           689:            yyerror ("need a sub-identifier, not an object identifier");
        !           690: 
        !           691:        case YV_NULL:
        !           692:            yyerror ("need a sub-identifier, not NULL");
        !           693: 
        !           694:        default:
        !           695:            myyerror ("unknown value: %d", yv -> yv_code);
        !           696:     }
        !           697: /* NOTREACHED */
        !           698: }
        !           699: 
        !           700: /*  */
        !           701: 
        !           702: static int  val2int (yv)
        !           703: register YV    yv;
        !           704: {
        !           705:     switch (yv -> yv_code) {
        !           706:        case YV_BOOL:
        !           707:        case YV_NUMBER:
        !           708:            return yv -> yv_number;
        !           709: 
        !           710:        case YV_STRING:
        !           711:            yyerror ("need an integer, not a string");
        !           712: 
        !           713:        case YV_IDEFINED:
        !           714:        case YV_IDLIST:
        !           715:            yyerror ("haven't written symbol table for values yet");
        !           716: 
        !           717:        case YV_VALIST:
        !           718:            yyerror ("need an integer, not a list of values");
        !           719: 
        !           720:        case YV_OIDLIST:
        !           721:            yyerror ("need an integer, not an object identifier");
        !           722: 
        !           723:        case YV_NULL:
        !           724:            yyerror ("need an integer, not NULL");
        !           725: 
        !           726:        default:
        !           727:            myyerror ("unknown value: %d", yv -> yv_code);
        !           728:     }
        !           729: /* NOTREACHED */
        !           730: }
        !           731: 
        !           732: /*  */
        !           733: 
        !           734: static val2prf (yv, level)
        !           735: register YV    yv;
        !           736: int    level;
        !           737: {
        !           738:     register YV    y;
        !           739: 
        !           740:     if (yv -> yv_flags & YV_ID)
        !           741:        printf ("%s ", yv -> yv_id);
        !           742: 
        !           743: #ifdef notdef
        !           744:     if (yv -> yv_flags & YV_TYPE)      /* will this REALLY work??? */
        !           745:        do_type (yv -> yv_type, level, NULLCP);
        !           746: #endif
        !           747: 
        !           748:     switch (yv -> yv_code) {
        !           749:        case YV_BOOL: 
        !           750:            printf (yv -> yv_number ? "TRUE" : "FALSE");
        !           751:            break;
        !           752: 
        !           753:        case YV_NUMBER: 
        !           754:            if (yv -> yv_named)
        !           755:                printf ("%s", yv -> yv_named);
        !           756:            else
        !           757:                printf ("%d", yv -> yv_number);
        !           758:            break;
        !           759: 
        !           760:        case YV_STRING: 
        !           761:            printf ("\"%s\"", yv -> yv_string);
        !           762:            break;
        !           763: 
        !           764:        case YV_IDEFINED: 
        !           765:            if (yv -> yv_module)
        !           766:                printf ("%s.", yv -> yv_module);
        !           767:            printf ("%s", yv -> yv_identifier);
        !           768:            break;
        !           769: 
        !           770:        case YV_IDLIST: 
        !           771:        case YV_VALIST: 
        !           772:            printf ("{");
        !           773:            for (y = yv -> yv_idlist; y; y = y -> yv_next) {
        !           774:                printf (" ");
        !           775:                val2prf (y, level + 1);
        !           776:                printf (y -> yv_next ? ", " : " ");
        !           777:            }
        !           778:            printf ("}");
        !           779:            break;
        !           780: 
        !           781:        case YV_OIDLIST: 
        !           782:            printf ("{");
        !           783:            for (y = yv -> yv_idlist; y; y = y -> yv_next) {
        !           784:                printf (" ");
        !           785:                val2prf (y, level + 1);
        !           786:                printf (" ");
        !           787:            }
        !           788:            printf ("}");
        !           789:            break;
        !           790: 
        !           791:        case YV_NULL: 
        !           792:            printf ("NULL");
        !           793:            break;
        !           794: 
        !           795:        default: 
        !           796:            myyerror ("unknown value: %d", yv -> yv_code);
        !           797:        /* NOTREACHED */
        !           798:     }
        !           799: }
        !           800: 
        !           801: /*    ACTION HANDLING */
        !           802: 
        !           803: static act2prf (cp, level, e1, e2)
        !           804: char   *cp,
        !           805:        *e1,
        !           806:        *e2;
        !           807: int    level;
        !           808: {
        !           809:     register int    i,
        !           810:                     j,
        !           811:                     l4;
        !           812:     register char  *dp,
        !           813:                    *ep,
        !           814:                    *fp;
        !           815:     char   *gp;
        !           816: 
        !           817:     if (e1)
        !           818:        printf (e1, level * 4, "");
        !           819: 
        !           820:     if (!(ep = index (dp = cp, '\n'))) {
        !           821:        printf ("%s", dp);
        !           822:        goto out;
        !           823:     }
        !           824: 
        !           825:     for (;;) {
        !           826:        i = expand (dp, ep, &gp);
        !           827:        if (gp) {
        !           828:            if (i == 0)
        !           829:                printf ("%*.*s\n", ep - dp, ep - dp, dp);
        !           830:            else
        !           831:                break;
        !           832:        }
        !           833: 
        !           834:        if (!(ep = index (dp = ep + 1, '\n'))) {
        !           835:            printf ("%s", dp);
        !           836:            return;
        !           837:        }
        !           838:     }
        !           839: 
        !           840: 
        !           841:     printf ("\n");
        !           842:     l4 = (level + 1) * 4;
        !           843:     for (; *dp; dp = fp) {
        !           844:        if (ep = index (dp, '\n'))
        !           845:            fp = ep + 1;
        !           846:        else
        !           847:            fp = ep = dp + strlen (dp);
        !           848: 
        !           849:        j = expand (dp, ep, &gp);
        !           850:        if (gp == NULL) {
        !           851:            if (*fp)
        !           852:                printf ("\n");
        !           853:            continue;
        !           854:        }
        !           855: 
        !           856:        if (j < i)
        !           857:            j = i;
        !           858:        if (j)
        !           859:            printf ("%*s", l4 + j - i, "");
        !           860:        printf ("%*.*s\n", ep - gp, ep - gp, gp);
        !           861:     }
        !           862: 
        !           863:     printf ("%*s", level * 4, "");
        !           864: out: ;
        !           865:     if (e2)
        !           866:        printf (e2, level * 4, "");
        !           867: }
        !           868: 
        !           869: 
        !           870: static expand (dp, ep, gp)
        !           871: register char  *dp,
        !           872:               *ep;
        !           873: char  **gp;
        !           874: {
        !           875:     register int    i;
        !           876: 
        !           877:     *gp = NULL;
        !           878:     for (i = 0; dp < ep; dp++) {
        !           879:        switch (*dp) {
        !           880:            case ' ': 
        !           881:                i++;
        !           882:                continue;
        !           883: 
        !           884:            case '\t': 
        !           885:                i += 8 - (i % 8);
        !           886:                continue;
        !           887: 
        !           888:            default: 
        !           889:                *gp = dp;
        !           890:                break;
        !           891:        }
        !           892:        break;
        !           893:     }
        !           894: 
        !           895:     return i;
        !           896: }
        !           897: 
        !           898: /*    DEBUG */
        !           899: 
        !           900: static print_yo (yo, level)
        !           901: register OT    yo;
        !           902: register int   level;
        !           903: {
        !           904:     if (yo == NULLOT)
        !           905:        return;
        !           906: 
        !           907:     fprintf (stderr, "%*sname=%s\n", level * 4, "", yo -> yo_name);
        !           908: 
        !           909:     if (yo -> yo_syntax) {
        !           910:        fprintf (stderr, "%*ssyntax\n", level * 4, "");
        !           911:        print_type (yo -> yo_syntax, level + 1);
        !           912:     }
        !           913:     if (yo -> yo_value) {
        !           914:        fprintf (stderr, "%*svalue\n", level * 4, "");
        !           915:        print_value (yo -> yo_value, level + 1);
        !           916:     }
        !           917: }
        !           918: 
        !           919: /*  */
        !           920: 
        !           921: static print_yi (yi, level)
        !           922: register OI    yi;
        !           923: register int   level;
        !           924: {
        !           925:     if (yi == NULLOI)
        !           926:        return;
        !           927: 
        !           928:     fprintf (stderr, "%*sname=%s\n", level * 4, "", yi -> yi_name);
        !           929: 
        !           930:     if (yi -> yi_value) {
        !           931:        fprintf (stderr, "%*svalue\n", level * 4, "");
        !           932:        print_value (yi -> yi_value, level + 1);
        !           933:     }
        !           934: }
        !           935: 
        !           936: /*  */
        !           937: 
        !           938: static print_type (yp, level)
        !           939: register YP    yp;
        !           940: register int   level;
        !           941: {
        !           942:     register YP            y;
        !           943:     register YV            yv;
        !           944: 
        !           945:     if (yp == NULLYP)
        !           946:        return;
        !           947: 
        !           948:     fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
        !           949:            yp -> yp_code, sprintb (yp -> yp_flags, YPBITS));
        !           950:     fprintf (stderr,
        !           951:            "%*sintexp=\"%s\" strexp=\"%s\" prfexp=%c declexp=\"%s\" varexp=\"%s\"\n",
        !           952:            level * 4, "", yp -> yp_intexp, yp -> yp_strexp, yp -> yp_prfexp,
        !           953:            yp -> yp_declexp, yp -> yp_varexp);
        !           954:     fprintf(stderr,
        !           955:            "%*sstructname=\"%s\" ptrname=\"%s\"\n", level * 4, "",
        !           956:            yp -> yp_structname, yp -> yp_ptrname);
        !           957: 
        !           958:     if (yp -> yp_action0)
        !           959:        fprintf (stderr, "%*saction0 at line %d=\"%s\"\n", level * 4, "",
        !           960:                yp -> yp_act0_lineno, yp -> yp_action0);
        !           961:     if (yp -> yp_action1)
        !           962:        fprintf (stderr, "%*saction1 at line %d=\"%s\"\n", level * 4, "",
        !           963:                yp -> yp_act1_lineno, yp -> yp_action1);
        !           964:     if (yp -> yp_action2)
        !           965:        fprintf (stderr, "%*saction2 at line %d=\"%s\"\n", level * 4, "",
        !           966:                yp -> yp_act2_lineno, yp -> yp_action2);
        !           967:     if (yp -> yp_action3)
        !           968:        fprintf (stderr, "%*saction3 at line %d=\"%s\"\n", level * 4, "",
        !           969:                yp -> yp_act3_lineno, yp -> yp_action3);
        !           970: 
        !           971:     if (yp -> yp_flags & YP_TAG) {
        !           972:        fprintf (stderr, "%*stag class=0x%x value=0x%x\n", level * 4, "",
        !           973:                yp -> yp_tag -> yt_class, yp -> yp_tag -> yt_value);
        !           974:        print_value (yp -> yp_tag -> yt_value, level + 1);
        !           975:     }
        !           976: 
        !           977:     if (yp -> yp_flags & YP_DEFAULT) {
        !           978:        fprintf (stderr, "%*sdefault=0x%x\n", level * 4, "", yp -> yp_default);
        !           979:        print_value (yp -> yp_default, level + 1);
        !           980:     }
        !           981: 
        !           982:     if (yp -> yp_flags & YP_ID)
        !           983:        fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yp -> yp_id);
        !           984: 
        !           985:     if (yp -> yp_flags & YP_BOUND)
        !           986:        fprintf (stderr, "%*sbound=\"%s\"\n", level * 4, "", yp -> yp_bound);
        !           987: 
        !           988:     if (yp -> yp_offset)
        !           989:        fprintf (stderr, "%*soffset=\"%s\"\n", level * 4, "", yp -> yp_offset);
        !           990: 
        !           991:     switch (yp -> yp_code) {
        !           992:        case YP_INTLIST:
        !           993:        case YP_BITLIST:
        !           994:            fprintf (stderr, "%*svalue=0x%x\n", level * 4, "", yp -> yp_value);
        !           995:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !           996:                print_value (yv, level + 1);
        !           997:                fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !           998:            }
        !           999:            break;
        !          1000: 
        !          1001:        case YP_SEQTYPE:
        !          1002:        case YP_SEQLIST:
        !          1003:        case YP_SETTYPE:
        !          1004:        case YP_SETLIST:
        !          1005:        case YP_CHOICE:
        !          1006:            fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yp -> yp_type);
        !          1007:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !          1008:                print_type (y, level + 1);
        !          1009:                fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          1010:            }
        !          1011:            break;
        !          1012: 
        !          1013:        case YP_IDEFINED:
        !          1014:            fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
        !          1015:                    level * 4, "", yp -> yp_module ? yp -> yp_module : "",
        !          1016:                    yp -> yp_identifier);
        !          1017:            break;
        !          1018: 
        !          1019:        default:
        !          1020:            break;
        !          1021:     }
        !          1022: }
        !          1023: 
        !          1024: /*  */
        !          1025: 
        !          1026: static print_value (yv, level)
        !          1027: register YV    yv;
        !          1028: register int   level;
        !          1029: {
        !          1030:     register YV            y;
        !          1031: 
        !          1032:     if (yv == NULLYV)
        !          1033:        return;
        !          1034: 
        !          1035:     fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
        !          1036:            yv -> yv_code, sprintb (yv -> yv_flags, YVBITS));
        !          1037: 
        !          1038:     if (yv -> yv_action)
        !          1039:        fprintf (stderr, "%*saction at line %d=\"%s\"\n", level * 4, "",
        !          1040:                yv -> yv_act_lineno, yv -> yv_action);
        !          1041: 
        !          1042:     if (yv -> yv_flags & YV_ID)
        !          1043:        fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yv -> yv_id);
        !          1044: 
        !          1045:     if (yv -> yv_flags & YV_NAMED)
        !          1046:        fprintf (stderr, "%*snamed=\"%s\"\n", level * 4, "", yv -> yv_named);
        !          1047: 
        !          1048:     if (yv -> yv_flags & YV_TYPE) {
        !          1049:        fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yv -> yv_type);
        !          1050:        print_type (yv -> yv_type, level + 1);
        !          1051:     }
        !          1052: 
        !          1053:     switch (yv -> yv_code) {
        !          1054:        case YV_NUMBER:
        !          1055:        case YV_BOOL:
        !          1056:            fprintf (stderr, "%*snumber=0x%x\n", level * 4, "",
        !          1057:                    yv -> yv_number);
        !          1058:            break;
        !          1059: 
        !          1060:        case YV_STRING:
        !          1061:            fprintf (stderr, "%*sstring=0x%x\n", level * 4, "",
        !          1062:                    yv -> yv_string);
        !          1063:            break;
        !          1064: 
        !          1065:        case YV_IDEFINED:
        !          1066:            if (yv -> yv_flags & YV_BOUND)
        !          1067:                fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
        !          1068:                        level * 4, "", yv -> yv_module, yv -> yv_identifier);
        !          1069:            else
        !          1070:                fprintf (stderr, "%*sbound identifier=\"%s\"\n",
        !          1071:                        level * 4, "", yv -> yv_identifier);
        !          1072:            break;
        !          1073: 
        !          1074:        case YV_IDLIST:
        !          1075:        case YV_VALIST:
        !          1076:        case YV_OIDLIST:
        !          1077:            for (y = yv -> yv_idlist; y; y = y -> yv_next) {
        !          1078:                print_value (y, level + 1);
        !          1079:                fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
        !          1080:            }
        !          1081:            break;
        !          1082: 
        !          1083:        default:
        !          1084:            break;
        !          1085:     }
        !          1086: }
        !          1087: 
        !          1088: /*    SYMBOLS */
        !          1089: 
        !          1090: static SY  new_symbol (encpref, decpref, prfpref, mod, id)
        !          1091: register char  *encpref,
        !          1092:               *decpref,
        !          1093:               *prfpref,
        !          1094:               *mod,
        !          1095:               *id;
        !          1096: {
        !          1097:     register SY    sy;
        !          1098: 
        !          1099:     if ((sy = (SY) calloc (1, sizeof *sy)) == NULLSY)
        !          1100:        yyerror ("out of memory");
        !          1101:     sy -> sy_encpref = encpref;
        !          1102:     sy -> sy_decpref = decpref;
        !          1103:     sy -> sy_prfpref = prfpref;
        !          1104:     sy -> sy_module = mod;
        !          1105:     sy -> sy_name = id;
        !          1106: 
        !          1107:     return sy;
        !          1108: }
        !          1109: 
        !          1110: 
        !          1111: static SY  add_symbol (s1, s2)
        !          1112: register SY    s1,
        !          1113:                s2;
        !          1114: {
        !          1115:     register SY            sy;
        !          1116: 
        !          1117:     if (s1 == NULLSY)
        !          1118:        return s2;
        !          1119: 
        !          1120:     for (sy = s1; sy -> sy_next; sy = sy -> sy_next)
        !          1121:        continue;
        !          1122:     sy -> sy_next = s2;
        !          1123: 
        !          1124:     return s1;
        !          1125: }
        !          1126: 
        !          1127: /*    TYPES */
        !          1128: 
        !          1129: YP     new_type (code)
        !          1130: int    code;
        !          1131: {
        !          1132:     register YP    yp;
        !          1133: 
        !          1134:     if ((yp = (YP) calloc (1, sizeof *yp)) == NULLYP)
        !          1135:        yyerror ("out of memory");
        !          1136:     yp -> yp_code = code;
        !          1137: 
        !          1138:     return yp;
        !          1139: }
        !          1140: 
        !          1141: 
        !          1142: YP     add_type (y1, y2)
        !          1143: register YP    y1,
        !          1144:                y2;
        !          1145: {
        !          1146:     register YP            yp;
        !          1147: 
        !          1148:     for (yp = y1; yp -> yp_next; yp = yp -> yp_next)
        !          1149:        continue;
        !          1150:     yp -> yp_next = y2;
        !          1151: 
        !          1152:     return y1;
        !          1153: }
        !          1154: 
        !          1155: /*    VALUES */
        !          1156: 
        !          1157: YV     new_value (code)
        !          1158: int    code;
        !          1159: {
        !          1160:     register YV    yv;
        !          1161: 
        !          1162:     if ((yv = (YV) calloc (1, sizeof *yv)) == NULLYV)
        !          1163:        yyerror ("out of memory");
        !          1164:     yv -> yv_code = code;
        !          1165: 
        !          1166:     return yv;
        !          1167: }
        !          1168: 
        !          1169: 
        !          1170: YV     add_value (y1, y2)
        !          1171: register YV    y1,
        !          1172:                y2;
        !          1173: {
        !          1174:     register YV            yv;
        !          1175: 
        !          1176:     for (yv = y1; yv -> yv_next; yv = yv -> yv_next)
        !          1177:        continue;
        !          1178:     yv -> yv_next = y2;
        !          1179: 
        !          1180:     return y1;
        !          1181: }
        !          1182: 
        !          1183: /*    TAGS */
        !          1184: 
        !          1185: YT     new_tag (class)
        !          1186: PElementClass  class;
        !          1187: {
        !          1188:     register YT    yt;
        !          1189: 
        !          1190:     if ((yt = (YT) calloc (1, sizeof *yt)) == NULLYT)
        !          1191:        yyerror ("out of memory");
        !          1192:     yt -> yt_class = class;
        !          1193: 
        !          1194:     return yt;
        !          1195: }
        !          1196: 
        !          1197: /*    STRINGS */
        !          1198: 
        !          1199: char   *new_string (s)
        !          1200: register char  *s;
        !          1201: {
        !          1202:     register char  *p;
        !          1203: 
        !          1204:     if ((p = malloc ((unsigned) (strlen (s) + 1))) == NULLCP)
        !          1205:        yyerror ("out of memory");
        !          1206: 
        !          1207:     (void) strcpy (p, s);
        !          1208:     return p;
        !          1209: }
        !          1210: 
        !          1211: /*    SYMBOLS */
        !          1212: 
        !          1213: static struct triple {
        !          1214:     char          *t_name;
        !          1215:     PElementClass   t_class;
        !          1216:     PElementID     t_id;
        !          1217: }              triples[] = {
        !          1218:     "IA5String", PE_CLASS_UNIV,        PE_DEFN_IA5S,
        !          1219:     "ISO646String", PE_CLASS_UNIV, PE_DEFN_IA5S,
        !          1220:     "NumericString", PE_CLASS_UNIV, PE_DEFN_NUMS,
        !          1221:     "PrintableString", PE_CLASS_UNIV, PE_DEFN_PRTS,
        !          1222:     "T61String", PE_CLASS_UNIV, PE_DEFN_T61S,
        !          1223:     "TeletexString", PE_CLASS_UNIV, PE_DEFN_T61S,
        !          1224:     "VideotexString", PE_CLASS_UNIV, PE_DEFN_VTXS,
        !          1225:     "GeneralizedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
        !          1226:     "GeneralisedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
        !          1227:     "UTCTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
        !          1228:     "UniversalTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
        !          1229:     "GraphicString", PE_CLASS_UNIV, PE_DEFN_GFXS,
        !          1230:     "VisibleString", PE_CLASS_UNIV, PE_DEFN_VISS,
        !          1231:     "GeneralString", PE_CLASS_UNIV, PE_DEFN_GENS,
        !          1232:     "EXTERNAL", PE_CLASS_UNIV, PE_CONS_EXTN,
        !          1233:     "ObjectDescriptor", PE_CLASS_UNIV, PE_PRIM_ODE,
        !          1234: 
        !          1235:     NULL
        !          1236: };
        !          1237: 
        !          1238: /*  */
        !          1239: 
        !          1240: static char *modsym (module, id, prefix)
        !          1241: register char  *module,
        !          1242:               *id;
        !          1243: char   *prefix;
        !          1244: {
        !          1245:     char    buf1[BUFSIZ],
        !          1246:             buf2[BUFSIZ],
        !          1247:             buf3[BUFSIZ];
        !          1248:     register struct triple *t;
        !          1249:     static char buffer[BUFSIZ];
        !          1250: 
        !          1251:     if (module == NULLCP)
        !          1252:        for (t = triples; t -> t_name; t++)
        !          1253:            if (strcmp (t -> t_name, id) == 0) {
        !          1254:                module = "UNIV";
        !          1255:                break;
        !          1256:            }
        !          1257: 
        !          1258:     if (prefix)
        !          1259:        modsym_aux (prefix, buf1);
        !          1260:     modsym_aux (module ? module : mymodule, buf2);
        !          1261:     modsym_aux (id, buf3);
        !          1262:     if (prefix)
        !          1263:        (void) sprintf (buffer, "%s_%s_%s", buf1, buf2, buf3);
        !          1264:     else
        !          1265:        (void) sprintf (buffer, "%s_%s", buf2, buf3);
        !          1266: 
        !          1267:     return buffer;
        !          1268: }
        !          1269: 
        !          1270: 
        !          1271: static modsym_aux (name, bp)
        !          1272: register char  *name,
        !          1273:               *bp;
        !          1274: {
        !          1275:     register char   c;
        !          1276: 
        !          1277:     while (c = *name++)
        !          1278:        switch (c) {
        !          1279:            case '-':
        !          1280:                *bp++ = '_';
        !          1281:                *bp++ = '_';
        !          1282:                break;
        !          1283: 
        !          1284:            default:
        !          1285:                *bp++ = c;
        !          1286:                break;
        !          1287:        }
        !          1288: 
        !          1289:     *bp = NULL;
        !          1290: }

unix.superglobalmegacorp.com

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