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