|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.