|
|
1.1 root 1: /* pepy.c - PE parser (yacc-based) */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/pepy/RCS/pepy.c,v 7.0 89/11/23 22:11:44 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/pepy/RCS/pepy.c,v 7.0 89/11/23 22:11:44 mrose Rel $
9: *
10: *
11: * $Log: pepy.c,v $
12: * Revision 7.0 89/11/23 22:11:44 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: #include <ctype.h>
29: #include <stdio.h>
30: #include <varargs.h>
31: #include "pepy.h"
32:
33: /* DATA */
34:
35: static char *aflag = NULL;
36: int Cflag = 1; /* pepy */
37: int dflag = 0;
38: int hflag = 0;
39: int Pflag = 0;
40: int rflag = 0;
41: char *bflag = NULLCP;
42: static int bwidth = 1;
43: char *module_actions = NULLCP;
44: int pepydebug = 0;
45: int doexternals = 1;
46: static int linepos = 0;
47: static int mflag = 0;
48: static int pflag = 0;
49: static int sflag = 0;
50:
51: static char *eval = NULLCP;
52:
53: char *mymodule = "";
54: OID mymoduleid = NULLOID;
55:
56: int yysection = YP_DECODER;
57: char *yyencpref = "build";
58: char *yydecpref = "parse";
59: char *yyprfpref = "print";
60: char *yyencdflt = "build";
61: char *yydecdflt = "parse";
62: char *yyprfdflt = "print";
63: static char *yyprefix;
64:
65: static struct section {
66: char *s_name;
67: int s_mode;
68: } sections[] = {
69: "ENCODE", YP_ENCODER,
70: "DECODE", YP_DECODER,
71: "PRINT", YP_PRINTER,
72:
73: NULL
74: };
75:
76: char *sysin = NULLCP;
77: static char sysout[BUFSIZ];
78:
79: typedef struct modlist {
80: char *md_module;
81: OID md_oid;
82:
83: struct modlist *md_next;
84: } modlist, *MD;
85: #define NULLMD ((MD) 0)
86:
87: static MD mymodules = NULLMD;
88:
89: typedef struct symlist {
90: char *sy_encpref;
91: char *sy_decpref;
92: char *sy_prfpref;
93: char *sy_module;
94: char *sy_name;
95:
96: YP sy_type;
97:
98: struct symlist *sy_next;
99: } symlist, *SY;
100: #define NULLSY ((SY) 0)
101:
102: static SY mysymbols = NULLSY;
103:
104:
105: char *gensym (), *modsym ();
106: MD lookup_module ();
107: FILE *open_ph_file ();
108: SY new_symbol (), add_symbol ();
109:
110: YP lookup_type (), lookup_binding ();
111: YT lookup_tag ();
112:
113: /* MAIN */
114:
115: /* ARGSUSED */
116:
117: main (argc, argv, envp)
118: int argc;
119: char **argv,
120: **envp;
121: {
122: register char *cp,
123: *sp;
124: register struct section *sectp;
125:
126: fprintf (stderr, "%s\n", pepyversion);
127:
128: sysout[0] = NULL;
129: for (argc--, argv++; argc > 0; argc--, argv++) {
130: cp = *argv;
131:
132: if (strcmp (cp, "-a") == 0) {
133: argc--, argv++;
134: if ((aflag = *argv) == NULL || *aflag == '-')
135: goto usage;
136: continue;
137: }
138: if (strcmp (cp, "-A") == 0) {
139: yysection = YP_ENCODER | YP_DECODER | YP_PRINTER;
140: continue;
141: }
142: if (strcmp (cp, "-d") == 0) {
143: dflag++;
144: continue;
145: }
146: if (strcmp (cp, "-h") == 0) {
147: hflag++;
148: continue;
149: }
150: if (strcmp (cp, "-m") == 0) {
151: mflag++;
152: continue;
153: }
154: if (strcmp (cp, "-P") == 0) {
155: Pflag++;
156: continue;
157: }
158: if (strcmp (cp, "-p") == 0) {
159: pflag++;
160: continue;
161: }
162: if (strcmp (cp, "-o") == 0) {
163: if (sysout[0]) {
164: fprintf (stderr, "too many output files\n");
165: exit (1);
166: }
167: if (bflag) {
168: not_practical: ;
169: fprintf (stderr, "-b & -o together is not practical\n");
170: exit (1);
171: }
172: argc--, argv++;
173: if ((cp = *argv) == NULL || (*cp == '-' && cp[1] != NULL))
174: goto usage;
175: (void) strcpy (sysout, cp);
176:
177: continue;
178: }
179: if (strcmp (cp, "-r") == 0) {
180: rflag++;
181: continue;
182: }
183: if (strcmp (cp, "-s") == 0) {
184: sflag++;
185: continue;
186: }
187: if (strcmp (cp, "-S") == 0) {
188:
189: argc--, argv++;
190: if ((cp = *argv) == NULL || *cp == '-')
191: goto usage;
192:
193: for (sectp = sections; sectp -> s_name; sectp++)
194: if (strcmp (sectp -> s_name, cp) == 0) {
195: yysection = sectp -> s_mode;
196: break;
197: }
198: if (!sectp -> s_name) {
199: fprintf (stderr, "unknown section name \"%s\"\n", cp);
200: exit (1);
201: }
202: continue;
203: }
204: if (strcmp (cp, "-b") == 0) {
205: if (bflag) {
206: fprintf (stderr, "too many prefixes\n");
207: exit (1);
208: }
209: if (sysout[0])
210: goto not_practical;
211: argc--, argv++;
212: if ((bflag = *argv) == NULL || *bflag == '-')
213: goto usage;
214: continue;
215: }
216:
217: if (sysin) {
218: usage: ;
219: fprintf (stderr,
220: "usage: pepy [-d] [-h] [-p] [-o module.c] [-r] [-s] [-S section] [-b prefix] module.py\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] || bflag)
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, ".py") == 0)
239: (void) sprintf (sysout, "%.*s.c", sp - cp, cp);
240: else
241: (void) sprintf (sysout, "%s.c", cp);
242: }
243:
244: switch (pepydebug = (cp = getenv ("PEPYTEST")) && *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 (pflag)
262: exit (pp ());
263:
264: if (strcmp (sysout, "-") == 0)
265: sysout[0] = NULL;
266: if (!bflag && *sysout && freopen (sysout, "w", stdout) == NULL) {
267: fprintf (stderr, "unable to write "), perror (sysout);
268: exit (1);
269: }
270:
271: if (!bflag)
272: prologue ();
273:
274: initoidtbl ();
275:
276: exit (yyparse ()); /* NOTREACHED */
277: }
278:
279: static prologue ()
280: {
281: char *cp;
282:
283: if (cp = index (pepyversion, ')'))
284: for (cp++; *cp != ' '; cp++)
285: if (*cp == NULL) {
286: cp = NULL;
287: break;
288: }
289: if (cp == NULL)
290: cp = pepyversion + strlen (pepyversion);
291: printf ("/* automatically generated by %*.*s, do not edit! */\n\n",
292: cp - pepyversion, cp - pepyversion, pepyversion);
293: printf ("#include %s\n\n", mflag ? "\"psap.h\"" : "<isode/psap.h>");
294: if (!bflag)
295: printf ("static char *pepyid = \"%s\";\n\n", pepyversion);
296: if (aflag)
297: printf ("#define\tadvise\t%s\n\n", aflag);
298: printf ("void\tadvise ();\n");
299: }
300: /* ERRORS */
301:
302: yyerror (s)
303: register char *s;
304: {
305: yyerror_aux (s);
306:
307: if (*sysout)
308: (void) unlink (sysout);
309:
310: exit (1);
311: }
312:
313: #ifndef lint
314: warning (va_alist)
315: va_dcl
316: {
317: char buffer[BUFSIZ];
318: char buffer2[BUFSIZ];
319: char *cp;
320: va_list ap;
321:
322: va_start (ap);
323:
324: _asprintf (buffer, NULLCP, ap);
325:
326: va_end (ap);
327:
328: (void) sprintf (buffer2, "Warning: %s", buffer);
329: yyerror_aux (buffer2);
330: }
331:
332: #else
333:
334: /* VARARGS1 */
335: warning (fmt)
336: char *fmt;
337: {
338: warning (fmt);
339: }
340: #endif
341:
342: yyerror_aux (s)
343: register char *s;
344: {
345: if (linepos)
346: fprintf (stderr, "\n"), linepos = 0;
347:
348: if (eval)
349: fprintf (stderr, "type %s: ", eval);
350: else
351: fprintf (stderr, "line %d: ", yylineno);
352: fprintf (stderr, "%s\n", s);
353: if (!eval)
354: fprintf (stderr, "last token read was \"%s\"\n", yytext);
355: }
356:
357: /* */
358:
359:
360: #ifndef lint
361: myyerror (va_alist)
362: va_dcl
363: {
364: char buffer[BUFSIZ];
365: va_list ap;
366:
367: va_start (ap);
368:
369: _asprintf (buffer, NULLCP, ap);
370:
371: va_end (ap);
372:
373: yyerror (buffer);
374: }
375: #else
376: /* VARARGS */
377:
378: myyerror (fmt)
379: char *fmt;
380: {
381: myyerror (fmt);
382: }
383: #endif
384:
385:
386: #ifndef lint
387: pyyerror (va_alist)
388: va_dcl
389: {
390: char buffer[BUFSIZ];
391: register YP yp;
392: va_list ap;
393:
394: va_start (ap);
395:
396: yp = va_arg (ap, YP);
397:
398: _asprintf (buffer, NULLCP, ap);
399:
400: va_end (ap);
401:
402: yyerror_aux (buffer);
403: print_type (yp, 0);
404:
405: if (*sysout)
406: (void) unlink (sysout);
407:
408: exit (1);
409: }
410: #else
411: /* VARARGS */
412: pyyerror (yp, fmt)
413: YP yp;
414: char *fmt;
415: {
416: pyyerror (yp, fmt);
417: }
418: #endif
419:
420: /* */
421:
422: yywrap () {
423: if (linepos)
424: fprintf (stderr, "\n"), linepos = 0;
425:
426: return 1;
427: }
428:
429: /* */
430:
431: yyprint (s, f, top)
432: char *s;
433: int f;
434: int top;
435: {
436: int len;
437: static int didf = 0;
438: static int nameoutput = 0;
439: static int outputlinelen = 79;
440:
441: if (sflag)
442: return;
443:
444: if (f && didf == 0) {
445: if (linepos)
446: fprintf (stderr, "\n\n");
447:
448: fprintf (stderr, "%s:", mymodule);
449: linepos = (nameoutput = strlen (mymodule) + 1) + 1;
450:
451: didf = 1;
452: }
453:
454: if (!nameoutput || top) {
455: if (linepos)
456: fprintf (stderr, "\n\n");
457:
458: fprintf (stderr, "%s", mymodule);
459: nameoutput = (linepos = strlen (mymodule)) + 1;
460:
461: #define section(flag,prefix) \
462: if (yysection & (flag)) { \
463: fprintf (stderr, " %s", (prefix)); \
464: linepos += strlen (prefix) + 1; \
465: } \
466: else \
467: fprintf (stderr, " none"), linepos += 5
468: section (YP_ENCODER, yyencpref);
469: section (YP_DECODER, yydecpref);
470: section (YP_PRINTER, yyprfpref);
471:
472: fprintf (stderr, ":");
473: linepos += 2;
474:
475: if (top)
476: return;
477: }
478:
479: len = strlen (s) + (f ? 2 : 0);
480: if (linepos != nameoutput)
481: if (len + linepos + 1 > outputlinelen)
482: fprintf (stderr, "\n%*s", linepos = nameoutput, "");
483: else
484: fprintf (stderr, " "), linepos++;
485: fprintf (stderr, f ? "(%s)" : "%s", s);
486: linepos += len;
487: }
488:
489: /* PASS1 */
490:
491: pass1 ()
492: {
493: if (!bflag)
494: prologue3 ();
495: }
496:
497: static prologue3 ()
498: {
499: printf ("\n/* Generated from module %s", mymodule);
500: if (mymoduleid)
501: printf (", Object Identifier %s", sprintoid (mymoduleid));
502: printf (" */\n");
503: }
504: /* */
505:
506: pass1_type (encpref, decpref, prfpref, mod, id, yp)
507: register char *encpref,
508: *decpref,
509: *prfpref,
510: *mod,
511: *id;
512: register YP yp;
513: {
514: register SY sy;
515:
516: if (pepydebug) {
517: if (linepos)
518: fprintf (stderr, "\n"), linepos = 0;
519:
520: fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
521: print_type (yp, 0);
522: fprintf (stderr, "--------\n");
523: }
524: else
525: if (!(yp -> yp_flags & YP_IMPORTED))
526: yyprint (id, 0, 0);
527:
528: sy = new_symbol (encpref, decpref, prfpref, mod, id, yp);
529: mysymbols = add_symbol (mysymbols, sy);
530: }
531:
532: /* PASS2 */
533:
534: pass2 () {
535: register SY sy;
536: register YP yp;
537:
538: if (!sflag)
539: (void) fflush (stderr);
540:
541: if (bflag) {
542: register int i,
543: j;
544:
545: i = 2, j = 10;
546: for (sy = mysymbols; sy; sy = sy -> sy_next)
547: if (!(sy -> sy_type -> yp_flags & YP_IMPORTED))
548: if (++i >= j)
549: bwidth++, j *= 10;
550: }
551: else
552: prologue2 ();
553:
554: if (strcmp (mymodule, "UNIV"))
555: (void) lookup_module ("UNIV", NULLOID);
556:
557: for (sy = mysymbols; sy; sy = sy -> sy_next) {
558: eval = sy -> sy_name;
559: yp = sy -> sy_type;
560: if (sy -> sy_module == NULLCP)
561: yyerror ("no module name associated with symbol");
562: if (yp -> yp_flags & YP_IMPORTED)
563: continue;
564:
565: if (yp -> yp_direction & YP_ENCODER) {
566: if (bflag)
567: init_new_file ();
568: yyprefix = sy -> sy_encpref;
569: printf ("\n/* ARGSUSED */\n\n%sint\t%s ",
570: !doexternals && (yp -> yp_flags & YP_EXPORTED) ?
571: "static " : "",
572: modsym (sy -> sy_module,
573: sy -> sy_name, YP_ENCODER));
574: do_type (yp, 1, eval, "(*pe)");
575: printf ("\n return OK;\n}\n");
576: if (bflag)
577: end_file ();
578: }
579: if (yp -> yp_direction & YP_DECODER) {
580: if (bflag)
581: init_new_file ();
582: yyprefix = sy -> sy_decpref;
583: printf ("\n/* ARGSUSED */\n\n%sint\t%s ",
584: !doexternals && (yp -> yp_flags & YP_EXPORTED) ?
585: "static " : "",
586: modsym (sy -> sy_module,
587: sy -> sy_name, YP_DECODER));
588: undo_type (yp, 1, eval, "pe", 0);
589: printf ("\n return OK;\n}\n");
590: if (bflag)
591: end_file ();
592: }
593: if (yp -> yp_direction & YP_PRINTER) {
594: if (bflag)
595: init_new_file ();
596: yyprefix = sy -> sy_prfpref;
597: printf ("\n/* ARGSUSED */\n\n%sint\t%s ",
598: !doexternals && (yp -> yp_flags & YP_EXPORTED) ?
599: "static " : "",
600: modsym (sy -> sy_module,
601: sy -> sy_name, YP_PRINTER));
602: undo_type (yp, 1, eval, "pe", 1);
603: printf ("\n return OK;\n}\n");
604: if (bflag)
605: end_file ();
606: }
607: if (!bflag && ferror (stdout))
608: myyerror ("write error - %s", sys_errname (errno));
609: }
610:
611: write_ph_file ();
612: }
613:
614: static prologue2 ()
615: {
616: printf("\n#ifndef PEPYPARM\n#define PEPYPARM char *\n");
617: printf ("#endif /* PEPYPARM */\n"); /* keep ansi happy ... */
618: printf("extern PEPYPARM NullParm;\n");
619: }
620:
621: /* */
622:
623: struct tuple tuples[] = {
624: YP_BOOL, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_BOOL",
625: PE_CLASS_UNIV, PE_PRIM_BOOL,
626: YP_INT, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_INT",
627: PE_CLASS_UNIV, PE_PRIM_INT,
628: YP_INTLIST, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_INT",
629: PE_CLASS_UNIV, PE_PRIM_INT,
630: YP_BIT, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_BITS",
631: PE_CLASS_UNIV, PE_PRIM_BITS,
632: YP_BITLIST, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_BITS",
633: PE_CLASS_UNIV, PE_PRIM_BITS,
634: YP_OCT, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_OCTS",
635: PE_CLASS_UNIV, PE_PRIM_OCTS,
636: YP_NULL, "PE_CLASS_UNIV", NULLCP, "PE_PRIM_NULL",
637: PE_CLASS_UNIV, PE_PRIM_NULL,
638: YP_OID, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_OID",
639: PE_CLASS_UNIV, PE_PRIM_OID,
640: YP_SEQ, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SEQ",
641: PE_CLASS_UNIV, PE_CONS_SEQ,
642: YP_SEQTYPE, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SEQ",
643: PE_CLASS_UNIV, PE_CONS_SEQ,
644: YP_SEQLIST, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SEQ",
645: PE_CLASS_UNIV, PE_CONS_SEQ,
646: YP_SET, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SET",
647: PE_CLASS_UNIV, PE_CONS_SET,
648: YP_SETTYPE, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SET",
649: PE_CLASS_UNIV, PE_CONS_SET,
650: YP_SETLIST, "PE_CLASS_UNIV", "PE_FORM_CONS", "PE_CONS_SET",
651: PE_CLASS_UNIV, PE_CONS_SET,
652: YP_ENUMLIST, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_ENUM",
653: PE_CLASS_UNIV, PE_PRIM_ENUM,
654: YP_REAL, "PE_CLASS_UNIV", "PE_FORM_PRIM", "PE_PRIM_REAL",
655: PE_CLASS_UNIV, PE_PRIM_REAL,
656:
657: YP_UNDF
658: };
659:
660: /* PULLUP */
661:
662: choice_pullup (yp, partial)
663: register YP yp;
664: int partial; /* pullup fully, or just enough? */
665: {
666: register YP *x,
667: y,
668: z,
669: *z1,
670: z2,
671: z3;
672:
673: for (x = &yp -> yp_type; y = *x; x = &y -> yp_next) {
674: if (y -> yp_flags & (YP_TAG | YP_BOUND))
675: continue;
676:
677: switch (y -> yp_code) {
678: case YP_IDEFINED:
679: if (partial)
680: continue;
681: if ((z = lookup_type (y -> yp_module, y -> yp_identifier))
682: == NULLYP
683: || z -> yp_code != YP_CHOICE)
684: continue;
685:
686: choice_pullup (z2 = copy_type (z), partial);
687: break;
688:
689: case YP_CHOICE:
690: choice_pullup (z2 = copy_type (y), partial);
691: break;
692:
693: default:
694: continue;
695: }
696: z = z3 = z2 -> yp_type;
697: for (z1 = &z -> yp_next; z2 = *z1; z1 = &z2 -> yp_next)
698: z3 = z2;
699: *z1 = y -> yp_next;
700: *x = z;
701: y = z3;
702: }
703: }
704:
705: /* */
706:
707: tag_pullup (yp, level, arg, whatsit)
708: register YP yp;
709: register int level;
710: char *arg,
711: *whatsit;
712: {
713: char *narg;
714: char *id = yp -> yp_flags & YP_ID ? yp -> yp_id : "member";
715:
716: printf ("%*s{\t/* %s TAG PULLUP */\n%*sregister PE %s;\n\n",
717: level * 4, "", whatsit, (level + 1) * 4, "", narg = gensym ());
718: level++;
719:
720: printf ("%*sif ((%s = prim2set (%s)) == NULLPE) {\n",
721: level * 4, "", narg, arg);
722: printf ("%*sadvise (NULLCP, \"%s %%s%s: %%s\", PEPY_ERR_BAD,\n",
723: (level + 1) * 4, "", id, whatsit);
724: printf ("%*spe_error (%s -> pe_errno));\n",
725: (level + 3) * 4, "", arg);
726: printf ("%*sreturn NOTOK;\n%*s}\n",
727: (level + 1) * 4, "", level * 4, "");
728: printf ("%*sif (%s -> pe_cardinal != 1) {\n",
729: level * 4, "", narg);
730: printf ("%*sadvise (NULLCP, \"%s %%s %s: %%d\", PEPY_ERR_TOO_MANY_TAGGED,\n",
731: (level + 1) * 4, "", id, whatsit);
732: printf ("%*s%s -> pe_cardinal);\n", (level + 3) * 4, "", narg);
733: printf ("%*sreturn NOTOK;\n%*s}\n",
734: (level + 1) * 4, "", level * 4, "");
735: printf ("%*s%s = first_member (%s);\n%*s}\n",
736: level * 4, "", arg, narg, (level - 1) * 4, "");
737: }
738:
739:
740: tag_pushdown (yp, level, arg, whatsit)
741: register YP yp;
742: register int level;
743: char *arg,
744: *whatsit;
745: {
746: char *narg;
747:
748: printf ("%*s{\t/* %s TAG PUSHDOWN */\n%*sPE %s_z;\n",
749: level * 4, "", whatsit, (level + 1) * 4, "", narg = gensym ());
750: level++;
751: printf ("%*sregister PE *%s = &%s_z;\n\n", level * 4, "", narg, narg);
752:
753: printf ("%*sif ((*%s = pe_alloc (PE_CLASS_%s, PE_FORM_CONS, %d)) == NULLPE) {\n",
754: level * 4, "", narg, pe_classlist[yp -> yp_tag -> yt_class],
755: val2int (yp -> yp_tag -> yt_value));
756: printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
757: (level + 1) * 4, "", whatsit);
758: printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "", level * 4, "");
759: printf ("%*s(*%s) -> pe_cons = %s;\n", level * 4, "", narg, arg);
760: printf ("%*s%s = *%s;\n", level * 4, "", arg, narg);
761:
762: level--;
763: printf ("%*s}\n", level * 4, "");
764: }
765:
766: /* TYPE HANDLING */
767:
768: tag_type (yp)
769: register YP yp;
770: {
771: register struct tuple *t;
772: register YT yt;
773: register YP y;
774:
775: switch (yp -> yp_code) {
776: case YP_IDEFINED:
777: if (yp -> yp_flags & YP_BOUND) {
778: if ((y = lookup_binding (yp -> yp_module, yp -> yp_identifier,
779: yp -> yp_bound)) == NULLYP)
780: myyerror ("type \"%s\" isn't defined for binding",
781: yp -> yp_identifier);
782: if (!(y -> yp_flags & YP_TAG))
783: myyerror ("type \"%s\" isn't tagged for binding",
784: yp -> yp_identifier);
785: yp -> yp_flags |= YP_TAG;
786: yp -> yp_tag = copy_tag (y -> yp_tag);
787: return;
788: }
789:
790: if (yt = lookup_tag (yp)) {
791: yp -> yp_flags |= YP_TAG | YP_IMPLICIT;
792: yp -> yp_tag = copy_tag (yt);
793: return;
794: }
795: if (!lookup_type (yp -> yp_module, yp -> yp_identifier))
796: pyyerror (yp, "don't know how to tag an undefined type");
797: break;
798:
799: default:
800: for (t = tuples; t ->t_type != YP_UNDF; t++)
801: if (t -> t_type == yp -> yp_code) {
802: yp -> yp_flags |= YP_TAG | YP_IMPLICIT;
803: yp -> yp_tag = new_tag (t -> t_classnum);
804: yp -> yp_tag -> yt_value = new_value (YV_NUMBER);
805: yp -> yp_tag -> yt_value -> yv_number = t -> t_idnum;
806: return;
807: }
808: break;
809: }
810:
811: pyyerror (yp, "don't know how to do a set/choice member that isn't tagged or bound");
812: }
813:
814: /* */
815:
816: YP lookup_type (mod, id)
817: register char *mod,
818: *id;
819: {
820: register SY sy;
821:
822: for (sy = mysymbols; sy; sy = sy -> sy_next) {
823: if (mod) {
824: if (strcmp (sy -> sy_module, mod))
825: continue;
826: }
827: else
828: if (strcmp (sy -> sy_module, mymodule)
829: && strcmp (sy -> sy_module, "UNIV"))
830: continue;
831:
832: if (strcmp (sy -> sy_name, id) == 0)
833: return sy -> sy_type;
834: }
835:
836: return NULLYP;
837: }
838:
839: /* */
840:
841: static YP lookup_binding (mod, id, binding)
842: register char *mod,
843: *id,
844: *binding;
845: {
846: register YP yp,
847: z;
848:
849: if ((yp = lookup_type (mod, id)) == NULLYP)
850: return NULLYP;
851:
852: if (yp -> yp_code != YP_CHOICE)
853: myyerror ("type \"%s\" isn't a CHOICE type", id);
854: for (z = yp -> yp_type; z; z = z -> yp_next)
855: if ((z -> yp_flags & YP_ID)
856: && strcmp (z -> yp_id, binding) == 0)
857: return z;
858:
859: myyerror ("type \"%s\" doesn't bind \"%s\"", id, binding);
860: /* NOTREACHED */
861: }
862:
863: /* */
864:
865: check_type (type, level, class, form, id, arg)
866: register char *type,
867: *class,
868: *form,
869: *id,
870: *arg;
871: register int level;
872: {
873: int explicit;
874:
875: if (level == 1) {
876: printf ("%*sif (explicit) {\n", level * 4, ""), level++;
877: explicit = 1;
878: }
879: else
880: explicit = 0;
881:
882: printf ("%*sif (%s -> pe_class != %s", level * 4, "", arg, class);
883: if (form)
884: printf ("\n%*s|| %s -> pe_form != %s\n%*s",
885: (level + 2) * 4, "", arg, form, (level + 2) * 4 - 1, "");
886: printf (" || %s -> pe_id != %s) {\n", arg, id);
887: printf ("%*sadvise (NULLCP, \"%s bad class/form/id: %%s/%%d/0x%%x\",\n",
888: (level + 1) * 4, "", type);
889: printf ("%*spe_classlist[%s -> pe_class], %s -> pe_form, %s -> pe_id);\n",
890: (level + 3) * 4, "", arg, arg, arg);
891: printf ("%*sreturn NOTOK;\n%*s}\n",
892: (level + 1) * 4, "", level * 4, "");
893:
894: if (explicit) {
895: level--, printf ("%*s}\n", level * 4, "");
896: if (form) {
897: printf ("%*selse\n%*sif (%s -> pe_form != %s) {\n",
898: level * 4, "", (level + 1) * 4, "", arg, form);
899: printf ("%*sadvise (NULLCP, \"%s bad form: %%d\", %s -> pe_form);\n",
900: (level + 2) * 4, "", type, arg);
901: printf ("%*sreturn NOTOK;\n%*s}\n",
902: (level + 2) * 4, "", (level + 1) * 4, "");
903: }
904: }
905:
906: printf ("\n");
907: }
908:
909: /* */
910:
911: int is_any_type (yp)
912: register YP yp;
913: {
914: register YP z;
915:
916: while (yp -> yp_code == YP_IDEFINED) {
917: if (yp -> yp_flags & YP_TAG)
918: return 0;
919:
920: if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
921: (void) lookup_module (yp -> yp_module, yp -> yp_modid);
922:
923: if (z = lookup_type (yp -> yp_module, yp -> yp_identifier)) {
924: yp = z;
925:
926: continue;
927: }
928:
929: break;
930: }
931:
932: return (yp -> yp_code == YP_ANY && !(yp -> yp_flags & YP_TAG));
933: }
934:
935: int is_nonimplicit_type (yp)
936: register YP yp;
937: {
938: register YP z;
939:
940: while (yp -> yp_code == YP_IDEFINED) {
941: if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) ==
942: (YP_TAG))
943: return 0;
944:
945: if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
946: (void) lookup_module (yp -> yp_module, yp -> yp_modid);
947:
948: if (z = lookup_type (yp -> yp_module, yp -> yp_identifier)) {
949: yp = z;
950:
951: continue;
952: }
953:
954: break;
955: }
956:
957: if (yp -> yp_code == YP_CHOICE || yp -> yp_code == YP_ANY) {
958: if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) ==
959: YP_TAG)
960: return 0;
961: return 1;
962: }
963: return 0;
964: }
965:
966: /* */
967:
968: uniqint (yv)
969: register YV yv;
970: {
971: register int i;
972: register YV y;
973:
974: for (; yv; yv = yv -> yv_next) {
975: i = val2int (yv);
976:
977: for (y = yv -> yv_next; y; y = y -> yv_next)
978: if (i == val2int (y)) {
979: warning ("non-unique values in list");
980: fprintf (stderr, "\tvalue=%d", i);
981: if (yv -> yv_flags & YV_NAMED)
982: fprintf (stderr, " name1=%s", yv -> yv_named);
983: if (y -> yv_flags & YV_NAMED)
984: fprintf (stderr, " name2=%s", y -> yv_named);
985: fprintf (stderr, "\n");
986: }
987: }
988: }
989:
990: /* */
991:
992: uniqtag (y, z)
993: register YP y,
994: z;
995: {
996: int i;
997: register int id;
998: register YT yt;
999: register YP yp;
1000:
1001: for (; y != z; y = y -> yp_next) {
1002: if ((yt = lookup_tag (y)) == NULLYT)
1003: continue;
1004:
1005: id = PE_ID (yt -> yt_class, i = val2int (yt -> yt_value));
1006:
1007: for (yp = y -> yp_next; yp != z; yp = yp -> yp_next) {
1008: if ((yt = lookup_tag (yp)) == NULLYT)
1009: continue;
1010:
1011: if (id == PE_ID (yt -> yt_class, val2int (yt -> yt_value))) {
1012: warning ("non-unique tags in list");
1013: fprintf (stderr, "\ttag=%s/%d", pe_classlist[yt -> yt_class],
1014: i);
1015: if (y -> yp_code == YP_IDEFINED)
1016: fprintf (stderr, " id1=%s", y -> yp_identifier);
1017: if (yp -> yp_code == YP_IDEFINED)
1018: fprintf (stderr, " id2=%s", yp -> yp_identifier);
1019: fprintf (stderr, "\n");
1020: }
1021: }
1022: }
1023: }
1024:
1025: /* */
1026:
1027: int val2int (yv)
1028: register YV yv;
1029: {
1030: switch (yv -> yv_code) {
1031: case YV_BOOL:
1032: case YV_NUMBER:
1033: return yv -> yv_number;
1034:
1035: case YV_STRING:
1036: yyerror ("need an integer, not a string");
1037:
1038: case YV_IDEFINED:
1039: case YV_IDLIST:
1040: yyerror ("haven't written symbol table for values yet");
1041:
1042: case YV_VALIST:
1043: yyerror ("need an integer, not a list of values");
1044:
1045: case YV_NULL:
1046: yyerror ("need an integer, not NULL");
1047:
1048: default:
1049: myyerror ("unknown value: %d", yv -> yv_code);
1050: }
1051: /* NOTREACHED */
1052: }
1053:
1054: /* PH FILES */
1055:
1056: /* really need much more information in the .ph file... */
1057:
1058: static read_ph_file (module, oid)
1059: register char *module;
1060: OID oid;
1061: {
1062: int class,
1063: value,
1064: direction;
1065: char buffer[BUFSIZ],
1066: file[BUFSIZ],
1067: id[BUFSIZ],
1068: encpref[BUFSIZ],
1069: decpref[BUFSIZ],
1070: printpref[BUFSIZ];
1071: char *p, *ep, *dp, *ppp;
1072: register FILE *fp;
1073: register YP yp;
1074: register YT yt;
1075: register YV yv;
1076:
1077: (void) sprintf (file, "%s.ph", module);
1078: if (oid)
1079: (void) sprintf (p = buffer, "%s.ph", sprintoid(oid));
1080: else
1081: p = NULLCP;
1082: if ((fp = open_ph_file (file, p, "r")) == NULL)
1083: {
1084: warning ("Can't find file %s%s%s failed\n",
1085: file, p ? "/" : "", p ? p : "");
1086: return;
1087: }
1088:
1089: if (strcmp (module, "UNIV"))
1090: yyprint (module, 1, 0);
1091:
1092: while (fgets (buffer, sizeof buffer, fp)) {
1093: if (sscanf (buffer, "%d/%d/%d: %s",
1094: &class, &value, &direction, id) !=4) {
1095: myyerror ("bad external definition in %s: %s",
1096: file, buffer);
1097: continue;
1098: }
1099: ppp = dp = ep = NULLCP;
1100: if (p = index(buffer, '|')) {
1101: if( sscanf (p+1, "%s %s %s\n", encpref, decpref, printpref) == 3) {
1102: ppp = new_string (printpref);
1103: dp = new_string (decpref);
1104: ep = new_string (encpref);
1105: }
1106: }
1107:
1108: yp = new_type (YP_ANY);
1109: yp -> yp_flags = YP_IMPORTED;
1110: if (class >= 0) {
1111: yp -> yp_flags |= YP_TAG;
1112: yp -> yp_tag = yt = new_tag ((PElementClass) class);
1113: yt -> yt_value = yv = new_value (YV_NUMBER);
1114: yv -> yv_number = value;
1115: }
1116: yp -> yp_direction = direction;
1117: pass1_type (ep, dp, ppp, new_string (module),
1118: new_string (id), yp);
1119: }
1120:
1121: (void) fclose (fp);
1122: }
1123:
1124: /* */
1125:
1126: static write_ph_file () {
1127: int msave;
1128: char file[BUFSIZ];
1129: char fileoid[BUFSIZ];
1130: char *cp;
1131: register FILE *fp;
1132: register SY sy;
1133: register YT yt;
1134: register YP yp;
1135:
1136: (void) sprintf (file, "%s.ph", mymodule);
1137: if (mymoduleid)
1138: (void) sprintf (cp = fileoid, "%s.ph", sprintoid(mymoduleid));
1139: else
1140: cp = NULLCP;
1141: msave = mflag, mflag = 0;
1142: if ((fp = open_ph_file (file, cp, "w")) == NULL)
1143: myyerror ("unable to write %s", file);
1144: mflag = msave;
1145:
1146: for (sy = mysymbols; sy; sy = sy -> sy_next) {
1147: yp = sy -> sy_type;
1148: if (yp -> yp_flags & YP_IMPORTED)
1149: continue;
1150: if (doexternals == 0 && (yp->yp_flags & YP_EXPORTED) == 0)
1151: continue;
1152:
1153: if (is_any_type (yp)) {
1154: fprintf (fp, "-1/0/%d: %s", yp -> yp_direction, sy -> sy_name);
1155: fprintf (fp, " |%s %s %s\n", yyencpref, yydecpref, yyprfpref);
1156: }
1157: else
1158: if ((yt = lookup_tag (yp)) && yt -> yt_class != PE_CLASS_CONT) {
1159: fprintf (fp, "%d/%d/%d: %s", yt -> yt_class,
1160: val2int (yt -> yt_value), yp -> yp_direction,
1161: sy -> sy_name);
1162: fprintf (fp, " |%s %s %s\n", yyencpref, yydecpref, yyprfpref);
1163: }
1164: }
1165:
1166: (void) fclose (fp);
1167: }
1168:
1169: /* */
1170:
1171: #ifndef PEPYPATH
1172: #define PEPYPATH ""
1173: #endif
1174:
1175:
1176: static FILE *open_ph_file (fn, fnoid, mode)
1177: char *fn,
1178: *fnoid,
1179: *mode;
1180: {
1181: register char *dst,
1182: *path;
1183: char fnb[BUFSIZ];
1184: register FILE *fp;
1185: static char *pepypath = NULL;
1186:
1187: if (*fn == '/')
1188: return fopen (fn, mode);
1189:
1190: if (mflag) { /* MOBY HACK */
1191: if (fnoid && (fp = fopen (fnoid, mode)) != NULL)
1192: return fp;
1193: if ((fp = fopen (fn, mode)) != NULL)
1194: return fp;
1195:
1196: if (fnoid) {
1197: (void) sprintf (fnb, "../pepy/%s", fnoid);
1198: if ((fp = fopen (fnb, mode)) != NULL)
1199: return fp;
1200: }
1201: (void) sprintf (fnb, "../pepy/%s", fn);
1202: if ((fp = fopen (fnb, mode)) != NULL)
1203: return fp;
1204:
1205: if (fnoid) {
1206: (void) sprintf (fnb, "../../pepy/%s", fnoid);
1207: if ((fp = fopen (fnb, mode)) != NULL)
1208: return fp;
1209: }
1210: (void) sprintf (fnb, "../../pepy/%s", fn);
1211: return fopen (fnb, mode);
1212: }
1213:
1214: if (pepypath == NULL && (pepypath = getenv ("PEPYPATH")) == NULL)
1215: pepypath = PEPYPATH;
1216: path = pepypath;
1217:
1218: do {
1219: dst = fnb;
1220: while (*path && *path != ':')
1221: *dst++ = *path++;
1222: if (dst != fnb)
1223: *dst++ = '/';
1224: if (fnoid) {
1225: (void) strcpy (dst, fnoid);
1226: if ((fp = fopen (fnb, mode)) != NULL)
1227: break;
1228: }
1229: (void) strcpy (dst, fn);
1230: if ((fp = fopen (fnb, mode)) != NULL)
1231: break;
1232: } while (*path++);
1233:
1234: return fp;
1235: }
1236:
1237: /* PRETTY-PRINTING */
1238:
1239: #define S0 0
1240: #define S1 1
1241: #define S2 2
1242: #define S3 3
1243: #define S4 4
1244: #define S5 5
1245: #define S6 6
1246: #define S7 7
1247: #define S8 8
1248: #define S9 9
1249:
1250: static int pp () {
1251: register int c,
1252: s;
1253: register char *bp,
1254: *wp;
1255: char buffer[BUFSIZ];
1256:
1257: for (s = S0, bp = buffer; (c = getchar ()) != EOF;)
1258: switch (s) {
1259: case S0:
1260: if (c == '%')
1261: s = S1;
1262: else if (c == '<')
1263: s = S4;
1264: else if (c == '[')
1265: s = S7;
1266: else
1267: if (isspace (c))
1268: *bp++ = c;
1269: else {
1270: flush: ;
1271: if (bp != buffer) {
1272: for (wp = buffer; wp < bp; wp++)
1273: putchar (*wp);
1274: bp = buffer;
1275: }
1276: putchar (c);
1277: }
1278: break;
1279:
1280: case S1:
1281: if (c == '{') {
1282: bp = buffer;
1283: s = S2;
1284: break;
1285: }
1286: *bp++ = '%';
1287: s = S0;
1288: goto flush;
1289:
1290: case S2:
1291: if (c == '%')
1292: s = S3;
1293: break;
1294:
1295: case S3:
1296: s = c == '}' ? S0 : S2;
1297: break;
1298:
1299: case S4:
1300: if ( c == '<') {
1301: bp = buffer;
1302: s = S5;
1303: break;
1304: }
1305: *bp++ = '<';
1306: s = S0;
1307: goto flush;
1308:
1309: case S5:
1310: if (c == '>')
1311: s = S6;
1312: break;
1313:
1314: case S6:
1315: s = c == '>' ? S0 : S5;
1316: break;
1317:
1318: case S7:
1319: if ( c == '[') {
1320: bp = buffer;
1321: s = S8;
1322: break;
1323: }
1324: *bp ++ = '[';
1325: s = S0;
1326: goto flush;
1327:
1328: case S8:
1329: if (c == ']')
1330: s = S9;
1331: break;
1332:
1333: case S9:
1334: s = c == ']' ? S0 : S8;
1335: break;
1336:
1337: default:
1338: printf ("s=%d\n", s);
1339: break;
1340: }
1341:
1342: if (bp != buffer)
1343: for (wp = buffer; wp < bp; wp++)
1344: putchar (*wp);
1345:
1346: return 0;
1347: }
1348:
1349: /* DEBUG */
1350:
1351: print_type (yp, level)
1352: register YP yp;
1353: register int level;
1354: {
1355: register YP y;
1356: register YV yv;
1357:
1358: if (yp == NULLYP)
1359: return;
1360:
1361: fprintf (stderr, "%*scode=0x%x flags=%s direction=0x%x\n", level * 4, "",
1362: yp -> yp_code, sprintb (yp -> yp_flags, YPBITS),
1363: yp -> yp_direction);
1364: fprintf (stderr,
1365: "%*sintexp=\"%s\" strexp=\"%s\" prfexp=%c declexp=\"%s\" varexp=\"%s\"\n",
1366: level * 4, "", yp -> yp_intexp, yp -> yp_strexp, yp -> yp_prfexp,
1367: yp -> yp_declexp, yp -> yp_varexp);
1368: if (yp -> yp_param_type)
1369: fprintf (stderr, "%*sparameter type=\"%s\"\n", level * 4, "",
1370: yp -> yp_param_type);
1371: if (yp -> yp_action0)
1372: fprintf (stderr, "%*saction0 at line %d=\"%s\"\n", level * 4, "",
1373: yp -> yp_act0_lineno, yp -> yp_action0);
1374: if (yp -> yp_action05)
1375: fprintf (stderr, "%*saction05 at line %d=\"%s\"\n", level * 4, "",
1376: yp -> yp_act05_lineno, yp -> yp_action05);
1377: if (yp -> yp_action1)
1378: fprintf (stderr, "%*saction1 at line %d=\"%s\"\n", level * 4, "",
1379: yp -> yp_act1_lineno, yp -> yp_action1);
1380: if (yp -> yp_action2)
1381: fprintf (stderr, "%*saction2 at line %d=\"%s\"\n", level * 4, "",
1382: yp -> yp_act2_lineno, yp -> yp_action2);
1383: if (yp -> yp_action3)
1384: fprintf (stderr, "%*saction3 at line %d=\"%s\"\n", level * 4, "",
1385: yp -> yp_act3_lineno, yp -> yp_action3);
1386:
1387: if (yp -> yp_flags & YP_TAG) {
1388: fprintf (stderr, "%*stag class=0x%x value=0x%x\n", level * 4, "",
1389: yp -> yp_tag -> yt_class, yp -> yp_tag -> yt_value);
1390: print_value (yp -> yp_tag -> yt_value, level + 1);
1391: }
1392:
1393: if (yp -> yp_flags & YP_DEFAULT) {
1394: fprintf (stderr, "%*sdefault=0x%x\n", level * 4, "", yp -> yp_default);
1395: print_value (yp -> yp_default, level + 1);
1396: }
1397:
1398: if (yp -> yp_flags & YP_ID)
1399: fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yp -> yp_id);
1400:
1401: if (yp -> yp_flags & YP_BOUND)
1402: fprintf (stderr, "%*sbound=\"%s\"\n", level * 4, "", yp -> yp_bound);
1403:
1404: if (yp -> yp_offset)
1405: fprintf (stderr, "%*soffset=\"%s\"\n", level * 4, "", yp -> yp_offset);
1406:
1407: switch (yp -> yp_code) {
1408: case YP_INTLIST:
1409: case YP_BITLIST:
1410: fprintf (stderr, "%*svalue=0x%x\n", level * 4, "", yp -> yp_value);
1411: for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
1412: print_value (yv, level + 1);
1413: fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
1414: }
1415: break;
1416:
1417: case YP_SEQTYPE:
1418: case YP_SEQLIST:
1419: case YP_SETTYPE:
1420: case YP_SETLIST:
1421: case YP_CHOICE:
1422: fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yp -> yp_type);
1423: for (y = yp -> yp_type; y; y = y -> yp_next) {
1424: print_type (y, level + 1);
1425: fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
1426: }
1427: break;
1428:
1429: case YP_IDEFINED:
1430: fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
1431: level * 4, "", yp -> yp_module ? yp -> yp_module : "",
1432: yp -> yp_identifier);
1433: break;
1434:
1435: default:
1436: break;
1437: }
1438: }
1439:
1440: /* */
1441:
1442: static print_value (yv, level)
1443: register YV yv;
1444: register int level;
1445: {
1446: register YV y;
1447:
1448: if (yv == NULLYV)
1449: return;
1450:
1451: fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
1452: yv -> yv_code, sprintb (yv -> yv_flags, YVBITS));
1453:
1454: if (yv -> yv_action)
1455: fprintf (stderr, "%*saction at line %d=\"%s\"\n", level * 4, "",
1456: yv -> yv_act_lineno, yv -> yv_action);
1457:
1458: if (yv -> yv_flags & YV_ID)
1459: fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yv -> yv_id);
1460:
1461: if (yv -> yv_flags & YV_NAMED)
1462: fprintf (stderr, "%*snamed=\"%s\"\n", level * 4, "", yv -> yv_named);
1463:
1464: if (yv -> yv_flags & YV_TYPE) {
1465: fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yv -> yv_type);
1466: print_type (yv -> yv_type, level + 1);
1467: }
1468:
1469: switch (yv -> yv_code) {
1470: case YV_NUMBER:
1471: case YV_BOOL:
1472: fprintf (stderr, "%*snumber=0x%x\n", level * 4, "",
1473: yv -> yv_number);
1474: break;
1475:
1476: case YV_STRING:
1477: fprintf (stderr, "%*sstring=0x%x\n", level * 4, "",
1478: yv -> yv_string);
1479: break;
1480:
1481: case YV_IDEFINED:
1482: if (yv -> yv_flags & YV_BOUND)
1483: fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
1484: level * 4, "", yv -> yv_module, yv -> yv_identifier);
1485: else
1486: fprintf (stderr, "%*sbound identifier=\"%s\"\n",
1487: level * 4, "", yv -> yv_identifier);
1488: break;
1489:
1490: case YV_IDLIST:
1491: case YV_VALIST:
1492: for (y = yv -> yv_idlist; y; y = y -> yv_next) {
1493: print_value (y, level + 1);
1494: fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
1495: }
1496: break;
1497:
1498: default:
1499: break;
1500: }
1501: }
1502:
1503: /* SYMBOLS */
1504:
1505: static SY new_symbol (encpref, decpref, prfpref, mod, id, type)
1506: register char *encpref,
1507: *decpref,
1508: *prfpref,
1509: *mod,
1510: *id;
1511: register YP type;
1512: {
1513: register SY sy;
1514:
1515: if ((sy = (SY) calloc (1, sizeof *sy)) == NULLSY)
1516: yyerror ("out of memory");
1517: sy -> sy_encpref = encpref;
1518: sy -> sy_decpref = decpref;
1519: sy -> sy_prfpref = prfpref;
1520: sy -> sy_module = mod;
1521: sy -> sy_name = id;
1522: sy -> sy_type = type;
1523:
1524: return sy;
1525: }
1526:
1527:
1528: static SY add_symbol (s1, s2)
1529: register SY s1,
1530: s2;
1531: {
1532: register SY sy;
1533:
1534: if (s1 == NULLSY)
1535: return s2;
1536:
1537: for (sy = s1; sy -> sy_next; sy = sy -> sy_next)
1538: continue;
1539: sy -> sy_next = s2;
1540:
1541: return s1;
1542: }
1543:
1544: /* MODULES */
1545:
1546: static MD lookup_module (module, oid)
1547: char *module;
1548: OID oid;
1549: {
1550: register MD md;
1551:
1552: for (md = mymodules; md; md = md -> md_next) {
1553: if (module && md -> md_module && strcmp (md -> md_module, module) == 0)
1554: return md;
1555: if (oid && md -> md_oid && oid_cmp(oid, md->md_oid) == 0)
1556: return md;
1557: }
1558:
1559: read_ph_file (module, oid);
1560:
1561: if ((md = (MD) calloc (1, sizeof *md)) == NULLMD)
1562: yyerror ("out of memory");
1563: md -> md_module = new_string (module);
1564: if (oid)
1565: md -> md_oid = oid_cpy(oid);
1566: else
1567: md -> md_oid = NULLOID;
1568:
1569: if (mymodules != NULLMD)
1570: md -> md_next = mymodules;
1571:
1572: return (mymodules = md);
1573: }
1574:
1575: /* TYPES */
1576:
1577: YP new_type (code)
1578: int code;
1579: {
1580: register YP yp;
1581:
1582: if ((yp = (YP) calloc (1, sizeof *yp)) == NULLYP)
1583: yyerror ("out of memory");
1584: yp -> yp_code = code;
1585:
1586: return yp;
1587: }
1588:
1589:
1590: YP add_type (y, z)
1591: register YP y,
1592: z;
1593: {
1594: register YP yp;
1595:
1596: for (yp = y; yp -> yp_next; yp = yp -> yp_next)
1597: continue;
1598: yp -> yp_next = z;
1599:
1600: return y;
1601: }
1602:
1603: /* */
1604:
1605: YP copy_type (yp)
1606: register YP yp;
1607: {
1608: register YP y;
1609:
1610: if (yp == NULLYP)
1611: return NULLYP;
1612:
1613: y = new_type (yp -> yp_code);
1614: y -> yp_direction = yp -> yp_direction;
1615:
1616: switch (yp -> yp_code) {
1617: case YP_IDEFINED:
1618: if (yp -> yp_module)
1619: y -> yp_module = new_string (yp -> yp_module);
1620: y -> yp_identifier = new_string (yp -> yp_identifier);
1621: y -> yp_modid = oid_cpy (yp -> yp_modid);
1622: break;
1623:
1624: case YP_SEQTYPE:
1625: case YP_SEQLIST:
1626: case YP_SETTYPE:
1627: case YP_SETLIST:
1628: case YP_CHOICE:
1629: y -> yp_type = copy_type (yp -> yp_type);
1630: break;
1631:
1632: case YP_INTLIST:
1633: case YP_BITLIST:
1634: y -> yp_value = copy_value (yp -> yp_value);
1635: break;
1636:
1637: default:
1638: break;
1639: }
1640:
1641: y -> yp_intexp = yp -> yp_intexp;
1642: y -> yp_strexp = yp -> yp_strexp;
1643: y -> yp_prfexp = yp -> yp_prfexp;
1644:
1645: y -> yp_declexp = yp -> yp_declexp;
1646: y -> yp_varexp = yp -> yp_varexp;
1647:
1648: if (yp -> yp_structname)
1649: y -> yp_structname = new_string (yp -> yp_structname);
1650: if (yp -> yp_ptrname)
1651: y -> yp_ptrname = new_string (yp -> yp_ptrname);
1652:
1653: if (yp -> yp_param_type)
1654: y -> yp_param_type = new_string (yp -> yp_param_type);
1655:
1656: if (yp -> yp_action0) {
1657: y -> yp_action0 = new_string (yp -> yp_action0);
1658: y -> yp_act0_lineno = yp -> yp_act0_lineno;
1659: }
1660:
1661: if (yp -> yp_action05) {
1662: y -> yp_action05 = new_string (yp -> yp_action05);
1663: y -> yp_act05_lineno = yp -> yp_act05_lineno;
1664: }
1665:
1666: if (yp -> yp_action1) {
1667: y -> yp_action1 = new_string (yp -> yp_action1);
1668: y -> yp_act1_lineno = yp -> yp_act1_lineno;
1669: }
1670:
1671: if (yp -> yp_action2) {
1672: y -> yp_action2 = new_string (yp -> yp_action2);
1673: y -> yp_act2_lineno = yp -> yp_act2_lineno;
1674: }
1675:
1676: if (yp -> yp_action3) {
1677: y -> yp_action3 = new_string (yp -> yp_action3);
1678: y -> yp_act3_lineno = yp -> yp_act3_lineno;
1679: }
1680:
1681: y -> yp_flags = yp -> yp_flags;
1682:
1683: if (yp -> yp_flags & YP_DEFAULT)
1684: y -> yp_default = copy_value (yp -> yp_default);
1685:
1686: if (yp -> yp_flags & YP_ID)
1687: y -> yp_id = new_string (yp -> yp_id);
1688:
1689: if (yp -> yp_flags & YP_TAG)
1690: y -> yp_tag = copy_tag (yp -> yp_tag);
1691:
1692: if (yp -> yp_flags & YP_BOUND)
1693: y -> yp_bound = new_string (yp -> yp_bound);
1694:
1695: if (yp -> yp_flags & YP_PARMVAL)
1696: y -> yp_parm = new_string (yp -> yp_parm);
1697:
1698: if (yp -> yp_flags & YP_CONTROLLED)
1699: y -> yp_control = new_string (yp -> yp_control);
1700:
1701: if (yp -> yp_flags & YP_OPTCONTROL)
1702: y -> yp_optcontrol = new_string (yp -> yp_optcontrol);
1703:
1704: if (yp -> yp_offset)
1705: y -> yp_offset = new_string (yp -> yp_offset);
1706:
1707: if (yp -> yp_next)
1708: y -> yp_next = copy_type (yp -> yp_next);
1709:
1710: return y;
1711: }
1712:
1713: /* VALUES */
1714:
1715: YV new_value (code)
1716: int code;
1717: {
1718: register YV yv;
1719:
1720: if ((yv = (YV) calloc (1, sizeof *yv)) == NULLYV)
1721: yyerror ("out of memory");
1722: yv -> yv_code = code;
1723:
1724: return yv;
1725: }
1726:
1727:
1728: YV add_value (y, z)
1729: register YV y,
1730: z;
1731: {
1732: register YV yv;
1733:
1734: if (y == NULLYV)
1735: return z;
1736:
1737: if (z == NULLYV)
1738: return y;
1739:
1740: for (yv = y; yv -> yv_next; yv = yv -> yv_next)
1741: continue;
1742: yv -> yv_next = z;
1743:
1744: return y;
1745: }
1746:
1747: /* */
1748:
1749: YV copy_value (yv)
1750: register YV yv;
1751: {
1752: register YV y;
1753:
1754: if (yv == NULLYV)
1755: return NULLYV;
1756:
1757: y = new_value (yv -> yv_code);
1758: y -> yv_flags = yv -> yv_flags;
1759:
1760: if (yv -> yv_action) {
1761: y -> yv_action = new_string (yv -> yv_action);
1762: y -> yv_act_lineno = yv -> yv_act_lineno;
1763: }
1764:
1765: if (yv -> yv_flags & YV_ID)
1766: y -> yv_id = new_string (yv -> yv_id);
1767:
1768: if (yv -> yv_flags & YV_NAMED)
1769: y -> yv_named = new_string (yv -> yv_named);
1770:
1771: if (yv -> yv_flags & YV_TYPE)
1772: y -> yv_type = copy_type (yv -> yv_type);
1773:
1774: switch (yv -> yv_code) {
1775: case YV_NUMBER:
1776: case YV_BOOL:
1777: y -> yv_number = yv -> yv_number;
1778: break;
1779:
1780: case YV_STRING:
1781: y -> yv_string = new_string (yv -> yv_string);
1782: break;
1783:
1784: case YV_IDEFINED:
1785: if (yv -> yv_module)
1786: y -> yv_module = new_string (yv -> yv_module);
1787: y -> yv_identifier = new_string (yv -> yv_identifier);
1788: break;
1789:
1790: case YV_IDLIST:
1791: case YV_VALIST:
1792: y -> yv_idlist = copy_value (yv -> yv_idlist);
1793: break;
1794:
1795: default:
1796: break;
1797: }
1798:
1799: if (yv -> yv_next)
1800: y -> yv_next = copy_value (yv -> yv_next);
1801:
1802: return y;
1803: }
1804:
1805: /* TAGS */
1806:
1807: YT new_tag (class)
1808: PElementClass class;
1809: {
1810: register YT yt;
1811:
1812: if ((yt = (YT) calloc (1, sizeof *yt)) == NULLYT)
1813: yyerror ("out of memory");
1814: yt -> yt_class = class;
1815:
1816: return yt;
1817: }
1818:
1819: /* */
1820:
1821: YT copy_tag (yt)
1822: register YT yt;
1823: {
1824: register YT y;
1825:
1826: if (yt == NULLYT)
1827: return NULLYT;
1828:
1829: y = new_tag (yt -> yt_class);
1830:
1831: y -> yt_value = copy_value (yt -> yt_value);
1832:
1833: return y;
1834: }
1835:
1836: /* */
1837:
1838: YT lookup_tag (yp)
1839: register YP yp;
1840: {
1841: register struct tuple *t;
1842: static struct ypt ypts;
1843: register YT yt = &ypts;
1844: static struct ypv ypvs;
1845: register YV yv = &ypvs;
1846: register YP z;
1847:
1848: if (yp -> yp_flags & YP_TAG)
1849: return yp -> yp_tag;
1850:
1851: while (yp -> yp_code == YP_IDEFINED) {
1852: if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
1853: (void) lookup_module (yp -> yp_module, yp -> yp_modid);
1854:
1855: if (z = lookup_type (yp -> yp_module, yp -> yp_identifier)) {
1856: yp = z;
1857:
1858: if (yp -> yp_flags & YP_TAG)
1859: return yp -> yp_tag;
1860:
1861: continue;
1862: }
1863:
1864: break;
1865: }
1866:
1867: for (t = tuples; t -> t_type != YP_UNDF; t++)
1868: if (t -> t_type == yp -> yp_code) {
1869: yt -> yt_class = t -> t_classnum;
1870: yt -> yt_value = yv;
1871: yv -> yv_code = YV_NUMBER;
1872: yv -> yv_number = t -> t_idnum;
1873:
1874: return yt;
1875: }
1876:
1877: return NULLYT;
1878: }
1879:
1880: /* STRINGS */
1881:
1882: char *new_string (s)
1883: register char *s;
1884: {
1885: register char *p;
1886:
1887: if ((p = malloc ((unsigned) (strlen (s) + 1))) == NULLCP)
1888: yyerror ("out of memory");
1889:
1890: (void) strcpy (p, s);
1891: return p;
1892: }
1893:
1894: /* SYMBOLS */
1895:
1896: static struct triple {
1897: char *t_name;
1898: PElementClass t_class;
1899: PElementID t_id;
1900: } triples[] = {
1901: "IA5String", PE_CLASS_UNIV, PE_DEFN_IA5S,
1902: "ISO646String", PE_CLASS_UNIV, PE_DEFN_IA5S,
1903: "NumericString", PE_CLASS_UNIV, PE_DEFN_NUMS,
1904: "PrintableString", PE_CLASS_UNIV, PE_DEFN_PRTS,
1905: "T61String", PE_CLASS_UNIV, PE_DEFN_T61S,
1906: "TeletexString", PE_CLASS_UNIV, PE_DEFN_T61S,
1907: "VideotexString", PE_CLASS_UNIV, PE_DEFN_VTXS,
1908: "GeneralizedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
1909: "GeneralisedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
1910: "UTCTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
1911: "UniversalTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
1912: "GraphicString", PE_CLASS_UNIV, PE_DEFN_GFXS,
1913: "VisibleString", PE_CLASS_UNIV, PE_DEFN_VISS,
1914: "GeneralString", PE_CLASS_UNIV, PE_DEFN_GENS,
1915: "EXTERNAL", PE_CLASS_UNIV, PE_CONS_EXTN,
1916: "ObjectDescriptor", PE_CLASS_UNIV, PE_PRIM_ODE,
1917:
1918: NULL
1919: };
1920:
1921: /* */
1922:
1923: char *modsym (module, id, direct)
1924: register char *module,
1925: *id;
1926: int direct;
1927: {
1928: char buf1[BUFSIZ],
1929: buf2[BUFSIZ],
1930: buf3[BUFSIZ];
1931: char *pref;
1932: register struct triple *t;
1933: static char buffer[BUFSIZ];
1934:
1935: pref = NULLCP;
1936: if (module == NULLCP)
1937: for (t = triples; t -> t_name; t++)
1938: if (strcmp (t -> t_name, id) == 0) {
1939: module = "UNIV";
1940: break;
1941: }
1942:
1943: if (module && strcmp (module, mymodule))
1944: switch (direct) {
1945: case YP_DECODER:
1946: pref = yydecdflt;
1947: break;
1948:
1949: case YP_ENCODER:
1950: pref = yyencdflt;
1951: break;
1952:
1953: case YP_PRINTER:
1954: pref = yyprfdflt;
1955: break;
1956: }
1957:
1958: modsym_aux (pref ? pref : yyprefix, buf1);
1959: modsym_aux (module ? module : mymodule, buf2);
1960: modsym_aux (id, buf3);
1961: (void) sprintf (buffer, "%s_%s_%s", buf1, buf2, buf3);
1962:
1963: return buffer;
1964: }
1965:
1966:
1967: static modsym_aux (name, bp)
1968: register char *name,
1969: *bp;
1970: {
1971: register char c;
1972:
1973: while (c = *name++)
1974: switch (c) {
1975: case '-':
1976: *bp++ = '_';
1977: *bp++ = '_';
1978: break;
1979:
1980: default:
1981: *bp++ = c;
1982: break;
1983: }
1984:
1985: *bp = NULL;
1986: }
1987:
1988: /* */
1989:
1990: char *gensym () {
1991: char buffer[BUFSIZ];
1992: static int i = 0;
1993:
1994: (void) sprintf (buffer, "p%d", i++);
1995: return new_string (buffer);
1996: }
1997:
1998: init_new_file ()
1999: {
2000: static int file_no = 0;
2001: char buffer[BUFSIZ];
2002:
2003: (void) sprintf (buffer, "%s-%.*d.c", bflag, bwidth, ++file_no);
2004: if (freopen (buffer, "w", stdout) == NULL) {
2005: fprintf (stderr, "unable to write "), perror (buffer);
2006: exit (1);
2007: }
2008:
2009: prologue ();
2010: prologue3 ();
2011:
2012: if (module_actions)
2013: fputs (module_actions, stdout);
2014:
2015: prologue2 ();
2016: }
2017:
2018: end_file ()
2019: {
2020: (void) fflush (stdout);
2021: if (ferror (stdout))
2022: myyerror ("write error - %s", sys_errname (errno));
2023:
2024: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.