|
|
1.1 root 1: /* posy.c - PEPY optional structure-generator (yacc-based) */
2:
3: /* OPEN QUESTIONS:
4:
5: How to do smarter DEFAULT determination for the other types and NULLs
6:
7: Perhaps pull-up primitive IDentifiers
8:
9: Abort a CHOICE encoding if the structure is empty
10:
11:
12: HEURISTICS
13:
14: 1. LANGUAGE SIMPLIFICATIONS:
15:
16:
17: Pull-up uni-member SEQUENCEs/SETs/CHOICEs
18:
19:
20: 2. LANGUAGE ASSUMPTIONS:
21:
22: Unique tags to avoid conflicts for internal structures (-h1 option)
23:
24:
25: 3. STYLE ISSUES:
26:
27: SEQUENCE/SET OF Type should have Type be an ID for nicer naming
28: */
29:
30: #ifndef lint
31: static char *rcsid = "$Header: /f/osi/pepy/RCS/posy.c,v 7.3 90/02/23 17:50:09 mrose Exp $";
32: #endif
33:
34: /*
35: * $Header: /f/osi/pepy/RCS/posy.c,v 7.3 90/02/23 17:50:09 mrose Exp $
36: *
37: *
38: * $Log: posy.c,v $
39: * Revision 7.3 90/02/23 17:50:09 mrose
40: * update
41: *
42: * Revision 7.2 90/02/19 13:09:35 mrose
43: * update
44: *
45: * Revision 7.1 90/01/11 18:37:05 mrose
46: * real-sync
47: *
48: * Revision 7.0 89/11/23 22:11:59 mrose
49: * Release 6.0
50: *
51: */
52:
53: /*
54: * NOTICE
55: *
56: * Acquisition, use, and distribution of this module and related
57: * materials are subject to the restrictions of a license agreement.
58: * Consult the Preface in the User's Manual for the full terms of
59: * this agreement.
60: *
61: */
62:
63:
64: #include <ctype.h>
65: #include <stdio.h>
66: #include <varargs.h>
67: #include "pepy.h"
68:
69:
70: #define SVAL(s) ((s) ? (s) : "")
71: #define PARVAL(s) ((s) ? (s) : "parm")
72:
73: /* DATA */
74:
75: static int aflag = 0;
76: int Cflag = 0; /* posy */
77: int dflag = 0;
78: int Pflag = 0; /* pepy compat ... */
79: char *bflag = NULL; /* .. */
80: char *module_actions = NULL;
81: int pepydebug = 0;
82: int doexternals = 1;
83: static int fflag = 0;
84: static int linepos = 0;
85: static int mflag = 0;
86: static int sflag = 0;
87:
88: #define hflag (options[0])
89: #define Hflag (options[1])
90: #define h2flag (options[2])
91: #define NOPTIONS 3
92:
93: static int options[NOPTIONS];
94:
95: static char *eval = NULLCP;
96:
97: char *mymodule = "";
98: OID mymoduleid = NULLOID;
99: static char modulename[BUFSIZ];
100:
101: int yysection = YP_DECODER;
102: char *yyencpref = "encode";
103: char *yydecpref = "decode";
104: char *yyprfpref = "print";
105: char *yyencdflt = "encode";
106: char *yydecdflt = "decode";
107: char *yyprfdflt = "print";
108:
109: static char *classes[] = {
110: "UNIVERSAL ",
111: "APPLICATION ",
112: "",
113: "PRIVATE "
114: };
115:
116: static char *tags[] = {
117: "", "BOOLEAN", "INTEGER", "INTEGER", "BIT STRING", "BIT STRING",
118: "OCTET STRING", "NULL", "SEQUENCE", "SEQUENCE OF", "SEQUENCE", "SET",
119: "SET OF", "SET", "CHOICE", "ANY", "OBJECT IDENTIFIER", "", "ENUMERATED",
120: "REAL",
121:
122: NULL
123: };
124:
125: static char autogen[BUFSIZ];
126:
127: char *sysin = NULLCP;
128: static char sysout[BUFSIZ];
129: static char sysdef[BUFSIZ];
130: static char sysact[BUFSIZ];
131:
132: static FILE *fact;
133: static FILE *fdef;
134:
135: typedef struct modlist {
136: char *md_module;
137:
138: struct modlist *md_next;
139: } modlist, *MD;
140: #define NULLMD ((MD) 0)
141:
142: static MD mymodules = NULLMD;
143:
144: typedef struct symlist {
145: char *sy_encpref;
146: char *sy_decpref;
147: char *sy_prfpref;
148: char *sy_module;
149: char *sy_name;
150:
151: YP sy_type;
152:
153: struct symlist *sy_next;
154: } symlist, *SY;
155: #define NULLSY ((SY) 0)
156:
157: static SY mysymbols = NULLSY;
158:
159:
160: char *gensym (), *modsym (), *array ();
161: MD lookup_module ();
162: SY new_symbol (), add_symbol ();
163: static double val2real ();
164: static void prime_default ();
165: YP lookup_type ();
166:
167: /* MAIN */
168:
169: /* ARGSUSED */
170:
171: main (argc, argv, envp)
172: int argc;
173: char **argv,
174: **envp;
175: {
176: int i;
177: register char *cp,
178: *dp;
179:
180: dp = pepyversion + strlen ("pepy ");
181: fprintf (stderr, "posy %s\n", dp);
182:
183: sysout[0] = sysdef[0] = sysact[0] = NULL;
184: for (argc--, argv++; argc > 0; argc--, argv++) {
185: cp = *argv;
186:
187: if (strcmp (cp, "-a") == 0) {
188: aflag++;
189: continue;
190: }
191: if (strcmp (cp, "-d") == 0) {
192: dflag++;
193: continue;
194: }
195: if (strcmp (cp, "-f") == 0) {
196: dflag++, fflag++;
197: continue;
198: }
199: if (strncmp (cp, "-h", 2) == 0) {
200: if (cp[2] == NULL) {
201: hflag++;
202: continue;
203: }
204: if (sscanf (cp + 2, "%d", &i) != 1 || i >= NOPTIONS)
205: goto usage;
206: hflag++, options[i]++;
207: continue;
208: }
209: if (strcmp (cp, "-m") == 0) {
210: mflag++;
211: continue;
212: }
213: if (strcmp (cp, "-o") == 0) {
214: if (sysout[0]) {
215: fprintf (stderr, "too many output files\n");
216: exit (1);
217: }
218: argc--, argv++;
219: if ((cp = *argv) == NULL || (*cp == '-' && cp[1] != NULL))
220: goto usage;
221: (void) strcpy (sysout, cp);
222:
223: continue;
224: }
225: if (strcmp (cp, "-s") == 0) {
226: sflag++;
227: continue;
228: }
229:
230: if (sysin) {
231: usage: ;
232: fprintf (stderr,
233: "usage: posy [-a] [-d] [-f] [-Hh] [-o newmodule.py] [-s] module.py\n");
234: exit (1);
235: }
236:
237: if (*cp == '-') {
238: if (*++cp != NULL)
239: goto usage;
240: sysin = "";
241: }
242: sysin = cp;
243: }
244:
245: switch (pepydebug = (cp = getenv ("POSYTEST")) && *cp ? atoi (cp) : 0) {
246: case 2:
247: yydebug++; /* fall */
248: case 1:
249: sflag++; /* .. */
250: case 0:
251: break;
252: }
253:
254: if (sysin == NULLCP)
255: sysin = "";
256:
257: if (*sysin && freopen (sysin, "r", stdin) == NULL) {
258: fprintf (stderr, "unable to read "), perror (sysin);
259: exit (1);
260: }
261:
262: if (strcmp (sysout, "-") == 0)
263: sysout[0] = NULL;
264: if (*sysout && freopen (sysout, "w", stdout) == NULL) {
265: fprintf (stderr, "unable to write "), perror (sysout);
266: exit (1);
267: }
268:
269: if (cp = index (dp, ')')) {
270: for (cp++; *cp != ' '; cp++)
271: if (*cp == NULL)
272: break;
273: if (*cp == NULL)
274: cp = NULL;
275: }
276: if (cp == NULL)
277: cp = dp + strlen (dp);
278: (void) sprintf (autogen, "posy %*.*s", cp - dp, cp - dp, dp);
279: printf ("-- automatically generated by %s, do not edit!\n\n", autogen);
280:
281: initoidtbl ();
282:
283: exit (yyparse ()); /* NOTREACHED */
284: }
285:
286: /* ERRORS */
287:
288: yyerror (s)
289: register char *s;
290: {
291: yyerror_aux (s);
292:
293: if (*sysout)
294: (void) unlink (sysout);
295: if (*sysdef)
296: (void) unlink (sysdef);
297: if (*sysact)
298: (void) unlink (sysact);
299:
300: exit (1);
301: }
302:
303: #ifndef lint
304: warning (va_alist)
305: va_dcl
306: {
307: char buffer[BUFSIZ];
308: char buffer2[BUFSIZ];
309: char *cp;
310: va_list ap;
311:
312: va_start (ap);
313:
314: _asprintf (buffer, NULLCP, ap);
315:
316: va_end (ap);
317:
318: (void) sprintf (buffer2, "Warning: %s", buffer);
319: yyerror_aux (buffer2);
320: }
321:
322: #else
323:
324: /* VARARGS1 */
325: warning (fmt)
326: char *fmt;
327: {
328: warning (fmt);
329: }
330: #endif
331:
332: static yyerror_aux (s)
333: register char *s;
334: {
335: if (linepos)
336: fprintf (stderr, "\n"), linepos = 0;
337:
338: if (eval)
339: fprintf (stderr, "type %s: ", eval);
340: else
341: fprintf (stderr, "line %d: ", yylineno);
342: fprintf (stderr, "%s\n", s);
343: if (!eval)
344: fprintf (stderr, "last token read was \"%s\"\n", yytext);
345: }
346:
347: /* */
348:
349: #ifndef lint
350: myyerror (va_alist)
351: va_dcl
352: {
353: char buffer[BUFSIZ];
354: va_list ap;
355:
356: va_start (ap);
357:
358: _asprintf (buffer, NULLCP, ap);
359:
360: va_end (ap);
361:
362: yyerror (buffer);
363: }
364: #else
365: /* VARARGS */
366:
367: myyerror (fmt)
368: char *fmt;
369: {
370: myyerror (fmt);
371: }
372: #endif
373:
374:
375: #ifndef lint
376: static pyyerror (va_alist)
377: va_dcl
378: {
379: char buffer[BUFSIZ];
380: register YP yp;
381: va_list ap;
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:
395: if (*sysout)
396: (void) unlink (sysout);
397: if (*sysdef)
398: (void) unlink (sysdef);
399: if (*sysact)
400: (void) unlink (sysact);
401:
402: exit (1);
403: }
404: #else
405: /* VARARGS */
406:
407: static pyyerror (yp, fmt)
408: YP yp;
409: char *fmt;
410: {
411: pyyerror (yp, fmt);
412: }
413: #endif
414:
415: /* */
416:
417: yywrap () {
418: if (linepos)
419: fprintf (stderr, "\n"), linepos = 0;
420:
421: return 1;
422: }
423:
424: /* */
425:
426: /* ARGSUSED */
427:
428: yyprint (s, f, top)
429: char *s;
430: int f;
431: int top;
432: {
433: int len;
434: static int nameoutput = 0;
435: static int outputlinelen = 79;
436:
437: if (sflag || !s)
438: return;
439:
440: if (!nameoutput) {
441: if (linepos)
442: fprintf (stderr, "\n\n");
443:
444: fprintf (stderr, "%s", mymodule);
445: nameoutput = (linepos = strlen (mymodule)) + 1;
446:
447: fprintf (stderr, " types:");
448: linepos += 7;
449:
450: if (top)
451: return;
452: }
453:
454: len = strlen (s);
455: if (linepos != nameoutput)
456: if (len + linepos + 1 > outputlinelen)
457: fprintf (stderr, "\n%*s", linepos = nameoutput, "");
458: else
459: fprintf (stderr, " "), linepos++;
460: fprintf (stderr, "%s", s);
461: linepos += len;
462: }
463:
464: /* PASS1 */
465:
466: pass1 ()
467: {
468: printf ("%s ", mymodule);
469: if (mymoduleid) {
470: printf ("%s ", oidprint(mymoduleid));
471: }
472: printf ("DEFINITIONS ::=\n\n");
473: }
474:
475: /* */
476:
477: pass1_type (encpref, decpref, prfpref, mod, id, yp)
478: register char *encpref,
479: *decpref,
480: *prfpref,
481: *mod,
482: *id;
483: register YP yp;
484: {
485: register SY sy;
486:
487: if (lookup_type (mod, id)) /* no duplicate entries, please... */
488: return;
489:
490: if (pepydebug) {
491: if (linepos)
492: fprintf (stderr, "\n"), linepos = 0;
493:
494: fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id);
495: print_type (yp, 0);
496: fprintf (stderr, "--------\n");
497: }
498: else
499: if (!(yp -> yp_flags & YP_IMPORTED))
500: yyprint (id, 0, 0);
501:
502: sy = new_symbol (encpref, decpref, prfpref, mod, id, yp);
503: mysymbols = add_symbol (mysymbols, sy);
504: }
505:
506: /* PASS2 */
507:
508: pass2 () {
509: int first;
510: register SY sy;
511: register YP yp,
512: y;
513:
514: if (!sflag)
515: (void) fflush (stderr);
516:
517: modsym_aux (mymodule, modulename);
518:
519: (void) sprintf (sysdef, "%s-types.h", mymodule);
520: if ((fdef = fopen (sysdef, "w")) == NULL)
521: myyerror ("unable to write %s", sysdef);
522: fprintf (fdef, "/* automatically generated by %s, do not edit! */\n\n",
523: autogen);
524: fprintf (fdef, "#ifndef\t_module_%s_defined_\n", modulename);
525: fprintf (fdef, "#define\t_module_%s_defined_\n\n", modulename);
526:
527: fprintf (fdef, "#ifndef PEPYPATH\n");
528: fprintf (fdef, "#include <isode/psap.h>\n");
529: if (strcmp (mymodule, "UNIV"))
530: fprintf (fdef, "#include <isode/pepy/UNIV-types.h>\n");
531: fprintf (fdef, "#else\n");
532: fprintf (fdef, "#include \"psap.h\"\n");
533: if (strcmp (mymodule, "UNIV"))
534: fprintf (fdef, "#include \"../pepy/UNIV-types.h\"\n");
535: fprintf (fdef, "#endif\n");
536:
537: fprintf (fdef, "\n\n");
538:
539: if (fflag) {
540: (void) sprintf (sysact, "%s-types.tmp", mymodule);
541: if ((fact = fopen (sysact, "w+")) == NULL)
542: myyerror ("unable to write %s", sysact);
543: }
544:
545: for (sy = mysymbols; sy; sy = sy -> sy_next) {
546: eval = sy -> sy_name;
547: yp = sy -> sy_type;
548: if (sy -> sy_module == NULLCP)
549: yyerror ("no module name associated with symbol");
550: if (yp -> yp_flags & YP_IMPORTED)
551: continue;
552:
553: do_struct0 (yp, eval);
554: if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
555: myyerror ("write error - %s", sys_errname (errno));
556: }
557:
558: for (sy = mysymbols; sy; sy = sy -> sy_next) {
559: eval = sy -> sy_name;
560: yp = sy -> sy_type;
561: if (yp -> yp_flags & YP_IMPORTED)
562: continue;
563:
564: do_struct1 (yp, eval, NULLCP);
565: if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
566: myyerror ("write error - %s", sys_errname (errno));
567: }
568:
569: for (sy = mysymbols; sy; sy = sy -> sy_next) {
570: eval = sy -> sy_name;
571: yp = sy -> sy_type;
572: if (yp -> yp_flags & YP_IMPORTED)
573: continue;
574:
575: do_struct2 (yp, eval, NULLCP);
576: if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
577: myyerror ("write error - %s", sys_errname (errno));
578: }
579:
580: if (Cflag == 0)
581: printf ("%%{\n#include <stdio.h>\n#include \"%s\"\n%%}\n", sysdef);
582:
583: printf ("\nPREFIXES %s %s %s\n", yyencdflt, yydecdflt, yyprfdflt);
584:
585: printf ("\nBEGIN\n");
586:
587: print_expimp ();
588:
589: first = 1;
590: for (sy = mysymbols; sy; sy = sy -> sy_next) {
591: eval = sy -> sy_name;
592: yp = sy -> sy_type;
593: if (sy -> sy_module == NULLCP)
594: yyerror ("no module name associated with symbol");
595: if (yp -> yp_flags & YP_IMPORTED)
596: continue;
597:
598: if (first) {
599: printf ("\nENCODER %s\n", yyencpref);
600: first = 0;
601: }
602:
603: printf ("\n%s", sy -> sy_name);
604: printf (" [[P struct %s *]]",
605: modsym (mymodule, sy -> sy_name, "type"));
606: switch (yp -> yp_code) {
607: case YP_SEQTYPE:
608: case YP_SEQLIST:
609: case YP_SETTYPE:
610: case YP_SETLIST:
611: case YP_CHOICE:
612: if (yp -> yp_declexp || yp -> yp_type)
613: do_type0 (yp, YP_ENCODER);
614: break;
615:
616: case YP_BIT:
617: case YP_BITLIST:
618: do_type0 (yp, YP_ENCODER);
619: break;
620:
621: default:
622: if (!yp -> yp_declexp)
623: break;
624: do_type0 (yp, YP_ENCODER);
625: break;
626: }
627: printf (" ::=\n");
628: do_type1 (yp, 1, (yp -> yp_flags & YP_TAG) ? 1 : 2, eval, "parm",
629: NULLCP, YP_ENCODER);
630: printf ("\n");
631: if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
632: myyerror ("write error - %s", sys_errname (errno));
633: }
634:
635: first = 1;
636: for (sy = mysymbols; sy; sy = sy -> sy_next) {
637: eval = sy -> sy_name;
638: yp = sy -> sy_type;
639: if (sy -> sy_module == NULLCP)
640: yyerror ("no module name associated with symbol");
641: if (yp -> yp_flags & YP_IMPORTED)
642: continue;
643:
644: if (first) {
645: printf ("\nDECODER %s\n", yydecpref);
646: first = 0;
647: }
648:
649: printf ("\n%s", sy -> sy_name);
650: printf (" [[P struct %s **]]",
651: modsym (mymodule, sy -> sy_name, "type"));
652: switch (yp -> yp_code) {
653: case YP_SEQTYPE:
654: case YP_SEQLIST:
655: case YP_SETTYPE:
656: case YP_SETLIST:
657: case YP_CHOICE:
658: if (yp -> yp_declexp || yp -> yp_type)
659: do_type0 (yp, YP_DECODER);
660: break;
661:
662: default:
663: if (!yp -> yp_declexp)
664: break;
665: do_type0 (yp, YP_DECODER);
666: break;
667: }
668: printf (" ::=\n");
669:
670: y = yp;
671: again: ;
672: switch (y -> yp_code) {
673: case YP_SEQTYPE:
674: case YP_SETTYPE:
675: if (h2flag)
676: xalloc (y, 0, 1, "parm",
677: modsym (mymodule, sy -> sy_name, "type"), 1);
678: break;
679:
680: case YP_BIT:
681: case YP_BITLIST:
682: case YP_SEQ:
683: case YP_SET:
684: case YP_ANY:
685: case YP_OCT:
686: case YP_OID:
687: case YP_IDEFINED:
688: case YP_REAL:
689: break;
690:
691: case YP_SEQLIST:
692: case YP_SETLIST:
693: case YP_CHOICE:
694: if (hflag && y -> yp_type && !y -> yp_type -> yp_next) {
695: y = y -> yp_type;
696: goto again;
697: }
698: /* else fall */
699:
700: default:
701: xalloc (y, 1, 1, "parm",
702: modsym (mymodule, sy -> sy_name, "type"), 1);
703: break;
704: }
705: do_type1 (yp, 1, (yp -> yp_flags & YP_TAG) ? 1 : 2, eval, "(*parm)",
706: NULLCP, YP_DECODER);
707: printf ("\n");
708: if (ferror (stdout) || ferror (fdef) || (fflag && ferror (fact)))
709: myyerror ("write error - %s", sys_errname (errno));
710: }
711:
712: printf ("\nEND\n");
713:
714: if (fflag) {
715: register int c;
716:
717: (void) fflush (fact);
718: (void) fseek (fact, 0L, 0);
719:
720: printf ("\n%%{\n");
721: while ((c = getc (fact)) != EOF)
722: putchar (c);
723: printf ("\n%%}\n");
724:
725: (void) fclose (fact);
726: if (*sysact)
727: (void) unlink (sysact);
728: }
729:
730: fprintf (fdef, "#endif\n");
731: (void) fflush (fdef);
732: (void) fflush (stdout);
733: if (ferror (stdout) || ferror (fdef))
734: myyerror ("write error - %s", sys_errname (errno));
735: (void) fclose (fdef);
736: }
737:
738: /* */
739:
740: /* ARGSUSED */
741:
742: static do_struct0 (yp, id)
743: register YP yp;
744: char *id;
745: {
746: register YP y;
747:
748: switch (yp -> yp_code) {
749: case YP_SEQLIST:
750: case YP_SETLIST:
751: components_pullup (yp);
752: break;
753:
754: default:
755: break;
756: }
757:
758: switch (yp -> yp_code) {
759: case YP_SEQTYPE:
760: case YP_SETTYPE:
761: do_struct0 (yp -> yp_type, id);
762: break;
763:
764: case YP_CHOICE:
765: case YP_SETLIST:
766: choice_pullup (yp, yp -> yp_code == YP_CHOICE ? CH_FULLY
767: : CH_PARTIAL);
768: /* and fall */
769: case YP_SEQLIST:
770: for (y = yp -> yp_type; y; y = y -> yp_next)
771: do_struct0 (y, id);
772: break;
773:
774: case YP_IDEFINED:
775: if (yp -> yp_module
776: && strcmp (yp -> yp_module, mymodule)
777: && !lookup_module (yp -> yp_module))
778: fprintf (fdef, "#include \"%s-types.h\"\n", yp -> yp_module);
779: break;
780:
781: default:
782: break;
783: }
784: }
785:
786: /* */
787:
788: static do_struct1 (yp, id, pullup)
789: register YP yp;
790: char *id,
791: *pullup;
792: {
793: register int i,
794: j;
795: char buf1[BUFSIZ];
796: register YP y;
797: register YV yv;
798:
799: switch (yp -> yp_code) {
800: case YP_BIT:
801: case YP_BITLIST:
802: case YP_SEQ:
803: case YP_SET:
804: case YP_ANY:
805: fprintf (fdef, "\n");
806: if (aflag)
807: printag (yp, 4, pullup);
808: fprintf (fdef, "#define\t%s\tPElement\n",
809: modsym (mymodule, id, "type"));
810: if (yp -> yp_code == YP_BITLIST) {
811: i = -1;
812: for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
813: if ((j = val2int (yv)) < 0)
814: pyyerror (yp, "invalid bit number in BIT STRING");
815: else
816: if (j > i)
817: i = j;
818: if (i < sizeof (int) * 8) { /* NBBY */
819: fprintf (fdef, "#define\t%s\t\"\\020",
820: modsym (mymodule, eval, "bits"));
821: for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
822: if (yv -> yv_flags & YV_NAMED)
823: fprintf (fdef, "\\0%o%s",
824: val2int (yv) + 1, yv -> yv_named);
825: else
826: fprintf (fdef, "\\0%oBIT%d",
827: val2int (yv) + 1, val2int (yv));
828: fprintf (fdef, "\"\n");
829: }
830: for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
831: modsym_aux (yv -> yv_named, buf1);
832: fprintf (fdef, "#define\t%s_%s\t%d\n",
833: modsym (mymodule, eval, "bit"),
834: buf1, val2int (yv));
835: }
836: }
837: if (fflag)
838: fprintf (fdef, "#define\t%s\tpe_free\n",
839: modsym (mymodule, id, "free"));
840: break;
841:
842: case YP_OCT:
843: fprintf (fdef, "\n");
844: if (aflag)
845: printag (yp, 4, pullup);
846: fprintf (fdef, "#define\t%s\tqbuf\n",
847: modsym (mymodule, id, "type"));
848: if (fflag)
849: fprintf (fdef, "#define\t%s\tqb_free\n",
850: modsym (mymodule, id, "free"));
851: break;
852:
853: case YP_OID:
854: fprintf (fdef, "\n");
855: if (aflag)
856: printag (yp, 4, pullup);
857: fprintf (fdef, "#define\t%s\tOIDentifier\n",
858: modsym (mymodule, id, "type"));
859: if (fflag)
860: fprintf (fdef, "#define\t%s\toid_free\n",
861: modsym (mymodule, id, "free"));
862: break;
863:
864: case YP_IDEFINED:
865: fprintf (fdef, "\n");
866: if (aflag)
867: printag (yp, 4, pullup);
868: fprintf (fdef, "#define\t%s\t",
869: modsym (mymodule, id, "type"));
870: fprintf (fdef, "%s\n",
871: modsym (yp -> yp_module, yp -> yp_identifier, "type"));
872: if (fflag) {
873: fprintf (fdef, "#define\t%s\t",
874: modsym (mymodule, id, "free"));
875: fprintf (fdef, "%s\n",
876: modsym (yp -> yp_module, yp -> yp_identifier, "free"));
877: }
878: break;
879:
880: case YP_SEQLIST:
881: case YP_SETLIST:
882: case YP_CHOICE:
883: if (hflag && (y = yp -> yp_type) && !y -> yp_next) {
884: do_struct1 (y, id, tags[yp -> yp_code]);
885: break;
886: }
887: /* else fall */
888:
889: default:
890: break;
891: }
892: }
893:
894: /* */
895:
896: static do_struct2 (yp, id, pullup)
897: register YP yp;
898: char *id,
899: *pullup;
900: {
901: register YP y;
902: int flg = (yp -> yp_code == YP_SEQTYPE || yp -> yp_code == YP_SETTYPE);
903:
904: switch (yp -> yp_code) {
905: case YP_BIT:
906: case YP_BITLIST:
907: case YP_SEQ:
908: case YP_SET:
909: case YP_ANY:
910: case YP_OCT:
911: case YP_OID:
912: case YP_IDEFINED:
913: break;
914:
915: case YP_SEQLIST:
916: case YP_SETLIST:
917: case YP_CHOICE:
918: if (hflag && (y = yp -> yp_type) && !y -> yp_next) {
919: do_struct2 (y, id, tags[yp -> yp_code]);
920: break;
921: }
922: /* else fall */
923:
924: default:
925: fprintf (fdef, "\n");
926: if (aflag)
927: printag (yp, 4, pullup);
928: fprintf (fdef, "struct %s {\n", modsym (mymodule, id, "type"));
929: if (fflag) {
930: fprintf (fact, "\n%s (arg)\n", modsym (mymodule, id, "free"));
931: fprintf (fact, "struct %s *arg;\n{\n",
932: modsym (mymodule, id, "type"));
933: fprintf (fact, " struct %s *parm = arg;\n",
934: modsym (mymodule, id, "type"));
935: if (h2flag && flg)
936: fprintf (fact, " int\tn_parm;\n");
937: fprintf (fact, "\n if (parm == NULL)\n\treturn;\n\n");
938: }
939: posy (yp, 1, 1, "parm", id, "parm", flg && h2flag);
940: fprintf (fdef, "};\n");
941: fprintf (fdef, "int\t%s ();\n", modsym (mymodule, id, "free"));
942: if (fflag) {
943: if (yp -> yp_code != YP_SEQTYPE &&
944: yp -> yp_code != YP_SETTYPE)
945: fprintf (fact, "\n free ((char *) arg);");
946: fprintf (fact, "\n}\n");
947: }
948:
949: break;
950: }
951: }
952:
953: /* */
954:
955: static int type0_brackets;
956: static int type0_bit;
957:
958: static do_type0 (yp, direction)
959: register YP yp;
960: int direction;
961: {
962: type0_brackets = type0_bit = 0;
963: do_type0_aux (yp, direction);
964: if (type0_brackets)
965: printf (" %%}\n ");
966: }
967:
968: static do_type0_aux (yp, direction)
969: register YP yp;
970: int direction;
971: {
972: register YP y;
973:
974: if (yp -> yp_declexp) {
975: if (type0_brackets++ == 0)
976: printf ("\n %%{\n");
977: printf ("\tstruct %s *%s%s;\n", yp -> yp_declexp,
978: direction == YP_DECODER ? "*" : "", yp -> yp_declexp);
979: }
980:
981: switch (yp -> yp_code) {
982: case YP_SEQTYPE:
983: case YP_SETTYPE:
984: if (h2flag) {
985: if (type0_brackets++ == 0)
986: printf ("\n %%{\n");
987: printf ("\tint n_%s = 0;\n", yp -> yp_declexp ?
988: yp -> yp_declexp : "parm");
989: }
990: do_type0_aux (yp -> yp_type, direction);
991: break;
992:
993: case YP_SEQLIST:
994: case YP_SETLIST:
995: case YP_CHOICE:
996: for (y = yp -> yp_type; y; y = y -> yp_next)
997: do_type0_aux (y, direction);
998: break;
999:
1000: case YP_BIT:
1001: case YP_BITLIST:
1002: if (direction == YP_ENCODER) {
1003: if (type0_brackets++ == 0)
1004: printf ("\n %%{\n");
1005: if (type0_bit++ == 0)
1006: printf ("\tchar *bit_parm;\n");
1007: }
1008: break;
1009:
1010: default:
1011: break;
1012: }
1013: }
1014:
1015: /* */
1016:
1017: /* ARGSUSED */
1018:
1019: static do_type1 (yp, top, level, id, var, action2, direction)
1020: register YP yp;
1021: int top,
1022: level;
1023: char *id,
1024: *var,
1025: *action2;
1026: int direction;
1027: {
1028: int i;
1029: char *cp,
1030: *ep,
1031: buffer[BUFSIZ],
1032: varbuf[BUFSIZ];
1033: register YP y;
1034: register YV yv;
1035: register YT yt;
1036:
1037: printf ("%*s", level * 4, "");
1038:
1039: if (yp -> yp_flags & YP_ID) {
1040: printf ("%s", yp -> yp_id);
1041: if (!(yp -> yp_flags & YP_TAG))
1042: printf ("\n%*s", ++level * 4, "");
1043: }
1044:
1045: if (yp -> yp_flags & YP_TAG) {
1046: yt = yp -> yp_tag;
1047: printf ("[%s%d]\n", classes[yt -> yt_class], val2int (yt -> yt_value));
1048: level++;
1049: printf ("%*s", level * 4, "");
1050: }
1051: if (yp -> yp_flags & YP_OPTIONAL && yp -> yp_varexp) {
1052: if ((ep = index (yp -> yp_varexp, ' ')) == NULL)
1053: yyerror ("Bug in varexp!");
1054:
1055: (void) sprintf (varbuf, "%*.*s", ep - yp -> yp_varexp,
1056: ep - yp -> yp_varexp, yp -> yp_varexp);
1057: }
1058:
1059: switch (yp -> yp_code) {
1060: case YP_BOOL:
1061: if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
1062: direction == YP_DECODER) {
1063: if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
1064: printf ("dummy-for-default\n%*s", ++level * 4, "");
1065: if (yp -> yp_flags & YP_OPTIONAL)
1066: printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
1067: varbuf, yp -> yp_optcontrol, level * 4, "");
1068: else
1069: printf ("%%{ %s%s = %d; %%}\n%*s",
1070: var, SVAL (yp -> yp_varexp),
1071: val2int (yp -> yp_default) ? 1 : 0, level * 4, "");
1072: }
1073: break;
1074:
1075: case YP_INT:
1076: if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
1077: direction == YP_DECODER) {
1078: if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
1079: printf ("dummy-for-default\n%*s", ++level * 4, "");
1080: if (yp -> yp_flags & YP_OPTIONAL)
1081: printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
1082: varbuf, yp -> yp_optcontrol, level * 4, "");
1083: else
1084: printf ("%%{ %s%s = %d; %%}\n%*s",
1085: var, SVAL (yp -> yp_varexp),
1086: val2int (yp -> yp_default), level * 4, "");
1087: }
1088: break;
1089:
1090: case YP_INTLIST:
1091: case YP_ENUMLIST:
1092: if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
1093: direction == YP_DECODER) {
1094: if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
1095: printf ("dummy-for-default\n%*s", ++level * 4, "");
1096: if (yp -> yp_flags & YP_OPTIONAL)
1097: printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
1098: varbuf, yp -> yp_optcontrol, level * 4, "");
1099: else
1100: printf ("%%{ %s%s = %d; %%}\n%*s",
1101: var, SVAL (yp -> yp_varexp), dfl2int (yp),
1102: level * 4, "");
1103: }
1104: break;
1105:
1106: case YP_REAL:
1107: if ((yp -> yp_flags & (YP_OPTIONAL|YP_DEFAULT)) &&
1108: direction == YP_DECODER) {
1109: if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
1110: printf ("dummy-for-default\n%*s", ++level * 4, "");
1111: if (yp -> yp_flags & YP_OPTIONAL)
1112: printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
1113: varbuf, yp -> yp_optcontrol, level * 4, "");
1114: else
1115: printf ("%%{ %s%s = %g; %%}\n%*s",
1116: var, SVAL (yp -> yp_varexp),
1117: val2real (yp -> yp_default), level * 4, "");
1118: }
1119: break;
1120:
1121: case YP_NULL:
1122: if ((yp -> yp_flags & YP_OPTIONAL) && direction == YP_DECODER) {
1123: if (!top && !(yp -> yp_flags & (YP_ID | YP_TAG)))
1124: printf ("dummy-for-default\n%*s", ++level * 4, "");
1125: printf ("%%{ %s -> optionals |= %s; %%}\n%*s",
1126: varbuf, yp -> yp_optcontrol, level * 4, "");
1127: }
1128: break;
1129: }
1130:
1131: if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == (YP_TAG | YP_IMPLICIT))
1132: printf ("IMPLICIT ");
1133: if (yp -> yp_flags & YP_BOUND)
1134: printf ("%s < ", yp -> yp_bound);
1135: if (yp -> yp_flags & YP_COMPONENTS)
1136: printf ("COMPONENTS OF ");
1137: if (yp -> yp_flags & YP_ENCRYPTED)
1138: printf ("ENCRYPTED ");
1139:
1140: switch (yp -> yp_code) {
1141: case YP_BOOL:
1142: printf ("BOOLEAN");
1143: switch (direction) {
1144: case YP_ENCODER:
1145: case YP_DECODER:
1146: printf (top ? "\n%*s[[b %s -> %s ]]" : "\n%*s[[b %s%s ]]",
1147: level * 4, "", var, SVAL (yp -> yp_varexp));
1148: break;
1149: }
1150: break;
1151:
1152: case YP_INT:
1153: printf ("INTEGER");
1154: switch (direction) {
1155: case YP_ENCODER:
1156: case YP_DECODER:
1157: printf (top ? "\n%*s[[i %s -> %s ]]" : "\n%*s[[i %s%s ]]",
1158: level * 4, "", var, SVAL (yp -> yp_varexp));
1159: break;
1160: }
1161: break;
1162:
1163: case YP_INTLIST:
1164: case YP_ENUMLIST:
1165: if (yp -> yp_code == YP_ENUMLIST)
1166: printf ("ENUMERATED");
1167: else
1168: printf ("INTEGER");
1169: switch (direction) {
1170: case YP_ENCODER:
1171: case YP_DECODER:
1172: printf (top ? "\n%*s[[i %s -> %s ]]\n%*s{\n"
1173: : "\n%*s[[i %s%s ]]\n%*s{\n",
1174: level * 4, "", var, SVAL (yp -> yp_varexp),
1175: level * 4, "");
1176: break;
1177:
1178: default:
1179: printf (" {\n");
1180: break;
1181: }
1182: level++;
1183: for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
1184: printf ("%*s%s(%d)%s\n", level * 4, "", yv -> yv_named,
1185: val2int (yv), yv -> yv_next ? "," : "");
1186: level--;
1187: printf ("%*s}", level * 4, "");
1188: break;
1189:
1190: case YP_BIT:
1191: printf ("BIT STRING");
1192: switch (direction) {
1193: case YP_ENCODER:
1194: printf ("\n%*s[[x bit_parm = bitstr2strb (%s%s, &len) $ len]]",
1195: level * 4, "", var, SVAL (yp -> yp_varexp));
1196: printf ("\n%*s%%{\n%*sfree (bit_parm);\n", level * 4, "",
1197: (level + 1) * 4, "");
1198: if (action2)
1199: printf ("%*s%s\n", (level + 1) * 4, "", action2);
1200: printf ("%*s%%}\n", level * 4, "");
1201: break;
1202:
1203: case YP_DECODER:
1204: balloc (yp, var, action2, level);
1205: break;
1206: }
1207: break;
1208:
1209: case YP_BITLIST:
1210: printf ("BIT STRING");
1211: switch (direction) {
1212: case YP_ENCODER:
1213: printf ("\n%*s[[x bit_parm = bitstr2strb (%s%s, &len) $ len]]\n%*s{\n",
1214: level * 4, "", var, SVAL (yp -> yp_varexp),
1215: level * 4, "");
1216: break;
1217:
1218: case YP_DECODER:
1219: default:
1220: printf (" {\n");
1221: break;
1222: }
1223: level++;
1224: for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
1225: printf ("%*s%s(%d)%s\n", level * 4, "", yv -> yv_named,
1226: val2int (yv), yv -> yv_next ? "," : "");
1227: level--;
1228: printf ("%*s}", level * 4, "");
1229: switch (direction) {
1230: case YP_DECODER:
1231: balloc (yp, var, action2, level);
1232: break;
1233:
1234: case YP_ENCODER:
1235: printf ("\n%*s%%{\n%*sfree (bit_parm);\n", level * 4, "",
1236: (level + 1) * 4, "");
1237: if (action2)
1238: printf ("%*s%s\n", (level + 1) * 4, "", action2);
1239: printf ("%*s%%}\n", level * 4, "");
1240: break;
1241: }
1242: break;
1243:
1244: case YP_OCT:
1245: printf ("OCTET STRING");
1246: switch (direction) {
1247: case YP_ENCODER:
1248: printf ("\n%*s[[q %s%s ]]", level * 4, "",
1249: var, SVAL (yp -> yp_varexp));
1250: break;
1251:
1252: case YP_DECODER:
1253: printf ("\n%*s[[q %s%s ]]", level * 4, "",
1254: var, SVAL (yp -> yp_varexp));
1255: break;
1256: }
1257: break;
1258:
1259: case YP_REAL:
1260: printf ("REAL");
1261: printf (top ? "\n%*s[[r %s -> %s ]]" : "\n%*s[[r %s%s ]]",
1262: level * 4, "", var, SVAL (yp -> yp_varexp));
1263: break;
1264:
1265: case YP_NULL:
1266: printf ("NULL");
1267: break;
1268:
1269: case YP_SEQ:
1270: case YP_SET:
1271: case YP_ANY:
1272: printf ("%s", tags[yp -> yp_code]);
1273: switch (direction) {
1274: case YP_ENCODER:
1275: case YP_DECODER:
1276: printf ("\n%*s[[a %s%s ]]",
1277: level * 4, "", var, SVAL (yp -> yp_varexp));
1278: break;
1279: }
1280: break;
1281:
1282: case YP_SEQTYPE:
1283: case YP_SETTYPE:
1284: ep = yp -> yp_code != YP_SETTYPE ? "element" : "member";
1285: printf ("%s\n", tags [yp -> yp_code]);
1286: switch (direction) {
1287: case YP_ENCODER:
1288: if ((y = yp -> yp_type) -> yp_declexp) {
1289: printf ("%*s%%{ %s = %s; %%}\n",
1290: (level + 1) * 4, "", y -> yp_declexp,
1291: SVAL (y -> yp_varexp));
1292: }
1293: if (h2flag) {
1294: if (top) {
1295: printf ("%*s<<n_parm = 0; ", (level + 1) * 4, "");
1296: printf ("n_parm < parm -> nelem; n_parm++>>\n");
1297: }
1298: else {
1299: printf ("%*s<<n_%s = 0;\n%*sn_%s < %s -> nelem;\n",
1300: (level + 1) * 4, "", yp -> yp_declexp,
1301: (level + 3) * 4, "", yp -> yp_declexp,
1302: yp -> yp_declexp);
1303: printf ("%*sn_%s++>>\n",
1304: (level + 3) * 4, "", yp -> yp_declexp);
1305: }
1306: }
1307: else {
1308: if (top)
1309: printf ("%*s<<; parm; parm = parm -> next>>\n",
1310: (level + 1) * 4, "");
1311: else
1312: printf ("%*s<<%s = %s%s;\n%*s%s;\n%*s%s = %s -> next>>\n",
1313: (level + 1) * 4, "", yp -> yp_declexp,
1314: var, SVAL (yp -> yp_varexp),
1315: (level + 3) * 4, "", yp -> yp_declexp,
1316: (level + 3) * 4, "", yp -> yp_declexp,
1317: yp -> yp_declexp);
1318: }
1319: break;
1320:
1321: case YP_DECODER:
1322: if (h2flag) {
1323: y = yp -> yp_type;
1324: xalloc (y, 0, level + 2, y -> yp_declexp,
1325: y -> yp_declexp, 1);
1326: }
1327: else
1328: xalloc (yp, 0, level + 1,
1329: top ? "parm" : yp -> yp_declexp,
1330: top ? modsym (mymodule, eval, "type")
1331: : yp -> yp_declexp, 1);
1332: break;
1333: }
1334: do_type1 (yp -> yp_type, 0, level + 1, ep, "", NULLCP, direction);
1335: switch (direction) {
1336: case YP_DECODER:
1337: printf ("\n%*s%%{ ", (level + 1) * 4, "");
1338: if (h2flag)
1339: printf ("n_%s++;", top ? "parm" : yp -> yp_declexp);
1340: else
1341: if (top)
1342: printf ("parm = &((*parm) -> next);");
1343: else
1344: printf ("%s = &((*%s) -> next);",
1345: yp -> yp_declexp, yp -> yp_declexp);
1346: if (action2)
1347: printf (" %s", action2);
1348: printf (" %%}");
1349: break;
1350: }
1351: break;
1352:
1353: case YP_SEQLIST:
1354: case YP_SETLIST:
1355: ep = yp -> yp_code != YP_SETLIST ? "element" : "member";
1356: printf ("%s", tags [yp -> yp_code]);
1357: printf ("\n%*s%%{\n", (level + 1) * 4, "");
1358: if (direction == YP_DECODER)
1359: xalloc (yp, 1, level + 2, yp -> yp_declexp,
1360: yp -> yp_declexp, 0);
1361: for (y = yp -> yp_type; y; y = y -> yp_next) {
1362: if (y -> yp_declexp)
1363: switch (direction) {
1364: case YP_ENCODER:
1365: printf ("%*s%s = %s;\n",
1366: (level + 2) * 4, "",
1367: y -> yp_declexp, y -> yp_varexp);
1368: break;
1369:
1370: case YP_DECODER:
1371: printf ("%*s%s = &(%s);\n",
1372: (level + 2) * 4, "",
1373: y -> yp_declexp, y -> yp_varexp);
1374: break;
1375: }
1376: if (direction == YP_DECODER &&
1377: y -> yp_flags & YP_DEFAULT) {
1378: prime_default (y, level + 2);
1379: }
1380: }
1381: printf ("%*s%%}\n%*s{\n", (level + 1) * 4, "",
1382: level * 4, "");
1383:
1384: if (!hflag || !(y = yp -> yp_type) || y -> yp_next) {
1385: var = "";
1386: top = 0;
1387: }
1388: for (y = yp -> yp_type; y; y = y -> yp_next) {
1389: do_type1 (y, top,
1390: level + ((y -> yp_flags & (YP_ID | YP_TAG)) ? 1 : 2),
1391: ep, var, NULLCP, direction);
1392: printf ("%s\n", y -> yp_next ? ",\n" : "");
1393: }
1394: printf ("%*s}", level * 4, "");
1395: break;
1396:
1397: case YP_CHOICE:
1398: printf ("CHOICE");
1399: if (!hflag || !(y = yp -> yp_type) || y -> yp_next)
1400: var = "";
1401: i = 0;
1402: for (y = yp -> yp_type; y; y = y -> yp_next)
1403: if (y -> yp_declexp)
1404: i++;
1405: switch (direction) {
1406: case YP_ENCODER:
1407: if (i) {
1408: printf ("\n%*s%%{\n", (level + 1) * 4, "");
1409: for (y = yp -> yp_type; y; y = y -> yp_next)
1410: if (y -> yp_declexp)
1411: printf ("%*s%s = %s;\n", (level + 2) * 4, "",
1412: y -> yp_declexp, y -> yp_varexp);
1413: printf ("%*s%%}\n%*s", (level + 1) * 4, "",
1414: (level + 1) * 4 - 1, "" );
1415: }
1416: if (*var)
1417: printf (" <<1>>");
1418: else
1419: if (top)
1420: printf (" <<parm -> offset>>");
1421: else
1422: printf (" <<%s -> offset>>",
1423: yp -> yp_declexp);
1424: printf (i ? "\n%*s{\n" : " {\n", level * 4, "");
1425: break;
1426:
1427: case YP_DECODER:
1428: printf ("\n");
1429: xalloc (yp, 0, level + 1, yp -> yp_declexp,
1430: yp -> yp_declexp, 1);
1431: printf ("%*s{\n", level * 4, "");
1432: break;
1433:
1434: default:
1435: printf (" {\n");
1436: break;
1437: }
1438: if (direction == YP_DECODER) {
1439: (void) sprintf (cp = buffer, "(*(%s)) -> offset = ",
1440: top ? "parm" : yp -> yp_declexp);
1441: cp += strlen (cp);
1442: }
1443: else
1444: cp = NULL;
1445: if (!hflag || !(y = yp -> yp_type) || y -> yp_next)
1446: top = 0;
1447: else
1448: if (top)
1449: cp = NULL;
1450: for (y = yp -> yp_type; y; y = y -> yp_next) {
1451: if (cp)
1452: (void) sprintf (cp, "%s;", y -> yp_offset);
1453: do_type1 (y, top, level + 1, "choice", var,
1454: cp ? buffer : NULLCP, direction);
1455: printf ("%s\n", y -> yp_next ? ",\n" : "");
1456: }
1457: printf ("%*s}", level * 4, "");
1458: break;
1459:
1460: case YP_OID:
1461: printf ("OBJECT IDENTIFIER");
1462: switch (direction) {
1463: case YP_ENCODER:
1464: case YP_DECODER:
1465: printf ("\n%*s[[O %s%s ]]",
1466: level * 4, "", var, SVAL (yp -> yp_varexp));
1467: break;
1468: }
1469: break;
1470:
1471: case YP_IDEFINED:
1472: if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
1473: printf ("%s.", yp -> yp_module);
1474: printf ("%s", yp -> yp_identifier);
1475: switch (direction) {
1476: case YP_ENCODER:
1477: printf ("\n%*s[[p %s%s ]]",
1478: level * 4, "", var, SVAL (yp -> yp_varexp));
1479: break;
1480:
1481: case YP_DECODER:
1482: printf ("\n%*s[[p &(%s%s)]]",
1483: level * 4, "", var, SVAL (yp -> yp_varexp));
1484: break;
1485: }
1486: break;
1487:
1488: default:
1489: myyerror ("unknown type: %d", yp -> yp_code);
1490: }
1491:
1492: if (action2)
1493: switch (yp -> yp_code) {
1494: case YP_BIT:
1495: case YP_BITLIST:
1496: if (direction == YP_ENCODER)
1497: break;
1498: case YP_SEQTYPE:
1499: case YP_SETTYPE:
1500: if (direction == YP_DECODER)
1501: break;
1502: /* else fall */
1503:
1504: default:
1505: printf ("\n%*s%%{ %s %%}", level * 4, "", action2);
1506: break;
1507: }
1508:
1509: if (yp -> yp_flags & YP_OPTIONAL) {
1510: printf ("\n%*sOPTIONAL", level * 4, "");
1511:
1512: if (direction == YP_ENCODER)
1513: switch (yp -> yp_code) {
1514: case YP_BOOL:
1515: case YP_INT:
1516: case YP_INTLIST:
1517: case YP_ENUMLIST:
1518: case YP_NULL:
1519: case YP_REAL:
1520: printf (" <<%s -> optionals & %s >>",
1521: varbuf, yp -> yp_optcontrol);
1522: default:
1523: break;
1524:
1525: case YP_BIT:
1526: case YP_BITLIST:
1527: case YP_OCT:
1528: case YP_SEQ:
1529: case YP_SEQTYPE:
1530: case YP_SEQLIST:
1531: case YP_SET:
1532: case YP_SETTYPE:
1533: case YP_SETLIST:
1534: case YP_CHOICE:
1535: case YP_ANY:
1536: case YP_OID:
1537: case YP_IDEFINED:
1538: printf (" <<%s%s>>", var, SVAL (yp -> yp_varexp));
1539: break;
1540: }
1541: }
1542: else
1543: if (yp -> yp_flags & YP_DEFAULT) {
1544: printf ("\n%*sDEFAULT ", level * 4, "");
1545: val2prf (yp -> yp_default, level + 2);
1546:
1547: if (direction == YP_ENCODER)
1548: switch (yp -> yp_code) {
1549: case YP_BOOL:
1550: printf (" <<%s%s%s>>",
1551: val2int (yp -> yp_default) ? "!" : "",
1552: var, SVAL (yp -> yp_varexp));
1553: break;
1554:
1555: case YP_INT:
1556: case YP_INTLIST:
1557: case YP_ENUMLIST:
1558: printf (" <<%s%s != %d>>", var, SVAL (yp -> yp_varexp),
1559: dfl2int (yp));
1560: break;
1561:
1562: case YP_REAL:
1563: printf (" << %s%s != %g >>",
1564: var, SVAL (yp -> yp_varexp),
1565: val2real (yp -> yp_default));
1566: break;
1567:
1568: case YP_NULL:
1569: default:
1570: break;
1571:
1572: case YP_BIT:
1573: case YP_BITLIST:
1574: case YP_OCT:
1575: case YP_SEQ:
1576: case YP_SEQTYPE:
1577: case YP_SEQLIST:
1578: case YP_SET:
1579: case YP_SETTYPE:
1580: case YP_SETLIST:
1581: case YP_CHOICE:
1582: case YP_ANY:
1583: case YP_OID:
1584: case YP_IDEFINED:
1585: printf (" <<%s%s>>", var, SVAL (yp -> yp_varexp));
1586: break;
1587: }
1588: }
1589:
1590: if (direction == YP_ENCODER
1591: && yp -> yp_varexp
1592: && (cp = index (yp -> yp_varexp, ' '))
1593: && strncmp (cp + 1, "-> ", 3) == 0) {
1594: *cp = NULL;
1595: (void) sprintf (buffer, "(*%s) -> %s", yp -> yp_varexp, cp + 4);
1596: yp -> yp_varexp = new_string (buffer);
1597: }
1598: }
1599:
1600: /* TYPE HANDLING */
1601:
1602: static YP lookup_type (mod, id)
1603: register char *mod,
1604: *id;
1605: {
1606: register SY sy;
1607:
1608: for (sy = mysymbols; sy; sy = sy -> sy_next) {
1609: if (mod) {
1610: if (strcmp (sy -> sy_module, mod))
1611: continue;
1612: }
1613: else
1614: if (strcmp (sy -> sy_module, mymodule)
1615: && strcmp (sy -> sy_module, "UNIV"))
1616: continue;
1617:
1618: if (strcmp (sy -> sy_name, id) == 0)
1619: return sy -> sy_type;
1620: }
1621:
1622: return NULLYP;
1623: }
1624:
1625: /* */
1626:
1627: static posy (yp, top, level, id, val, var, arrayflg)
1628: register YP yp;
1629: int top,
1630: level,
1631: arrayflg;
1632: char *id,
1633: *val,
1634: *var;
1635: {
1636: register int i,
1637: j;
1638: register char *bp;
1639: char *cp,
1640: *dp,
1641: *ep,
1642: *newid,
1643: buf1[BUFSIZ],
1644: buf2[BUFSIZ],
1645: buf3[BUFSIZ];
1646: register YP y;
1647: register YV yv;
1648:
1649: (void) strcpy (bp = buf2, var);
1650: bp += strlen (bp);
1651:
1652: switch (yp -> yp_code) {
1653: case YP_BOOL:
1654: if (aflag)
1655: printag (yp, level + 4, NULLCP);
1656: fprintf (fdef, "%*schar %s;\n", level * 4, "",
1657: array(id, arrayflg));
1658: yp -> yp_varexp = new_string (buf2);
1659: break;
1660:
1661: case YP_INT:
1662: case YP_INTLIST:
1663: case YP_ENUMLIST:
1664: if (aflag)
1665: printag (yp, level + 4, NULLCP);
1666: fprintf (fdef, "%*sinteger %s;\n", level * 4, "",
1667: array(id, arrayflg));
1668: yp -> yp_varexp = new_string (buf2);
1669: if (yp -> yp_code == YP_INT)
1670: break;
1671: for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
1672: modsym_aux (yv -> yv_named, buf1);
1673: fprintf (fdef, "#define\t%s_%s\t%d\n",
1674: modsym (mymodule, top ? eval : id, "int"),
1675: buf1, val2int (yv));
1676: }
1677: break;
1678:
1679: case YP_BIT:
1680: case YP_BITLIST:
1681: if (!top) {
1682: if (aflag)
1683: printag (yp, level + 4, NULLCP);
1684: fprintf (fdef, "%*sPE %s;\n", level * 4, "",
1685: array(id, arrayflg));
1686: }
1687: if (fflag) {
1688: fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
1689: fprintf (fact,
1690: "%*spe_free (%s),\n%*s%s = NULLPE;\n",
1691: (level + 1) * 4, "", buf2,
1692: (level + 2) * 4, "", buf2);
1693: }
1694: yp -> yp_varexp = new_string (buf2);
1695: if (yp -> yp_code != YP_BITLIST)
1696: break;
1697: i = -1;
1698: for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
1699: if ((j = val2int (yv)) < 0)
1700: pyyerror (yp, "invalid bit number in BIT STRING");
1701: else
1702: if (j > i)
1703: i = j;
1704: if (i < sizeof (int) * 8) { /* NBBY */
1705: fprintf (fdef, "#define\t%s\t\"\\020",
1706: modsym (mymodule, top ? eval : id, "bits"));
1707: for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
1708: if (yv -> yv_flags & YV_NAMED)
1709: fprintf (fdef, "\\0%o%s",
1710: val2int (yv) + 1, yv -> yv_named);
1711: else
1712: fprintf (fdef, "\\0%oBIT%d",
1713: val2int (yv) + 1, val2int (yv));
1714: fprintf (fdef, "\"\n");
1715: }
1716: for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
1717: modsym_aux (yv -> yv_named, buf1);
1718: fprintf (fdef, "#define\t%s_%s\t%d\n",
1719: modsym (mymodule, top ? eval : id, "bit"),
1720: buf1, val2int (yv));
1721: }
1722: break;
1723:
1724: case YP_REAL:
1725: if (aflag)
1726: printag (yp, level + 4, NULLCP);
1727: fprintf (fdef, "%*sdouble %s;\n", level * 4, "",
1728: array(id, arrayflg));
1729: yp -> yp_varexp = new_string (buf2);
1730: break;
1731:
1732: case YP_OCT:
1733: if (!top) {
1734: if (aflag)
1735: printag (yp, level + 4, NULLCP);
1736: fprintf (fdef, "%*sstruct qbuf *%s;\n", level * 4, "",
1737: array(id, arrayflg));
1738: }
1739: if (fflag) {
1740: fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
1741: fprintf (fact,
1742: "%*sqb_free (%s),\n%*s%s = NULL;\n",
1743: (level + 1) * 4, "", buf2,
1744: (level + 2) * 4, "", buf2);
1745: }
1746: yp -> yp_varexp = new_string (buf2);
1747: break;
1748:
1749: case YP_NULL:
1750: if (aflag)
1751: printag (yp, level + 4, NULLCP);
1752: fprintf (fdef, "%*schar %s;\n", level * 4, "",
1753: array(id, arrayflg));
1754: if (yp -> yp_flags & YP_OPTIONAL)
1755: yp -> yp_varexp = new_string (buf2);
1756: break;
1757:
1758: case YP_SEQ:
1759: case YP_SET:
1760: case YP_ANY:
1761: if (!top) {
1762: if (aflag)
1763: printag (yp, level + 4, NULLCP);
1764: fprintf (fdef, "%*sPE %s;\n", level * 4, "",
1765: array(id, arrayflg));
1766: }
1767: if (fflag) {
1768: fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
1769: fprintf (fact,
1770: "%*spe_free (%s),\n%*s%s = NULLPE;\n",
1771: (level + 1) * 4, "", buf2,
1772: (level + 2) * 4, "", buf2);
1773: }
1774: yp -> yp_varexp = new_string (buf2);
1775: break;
1776:
1777: case YP_SEQTYPE:
1778: case YP_SETTYPE:
1779: ep = yp -> yp_code != YP_SETTYPE ? "element" : "member";
1780: if ((cp = rindex (buf2, ' ')) && *++cp) {
1781: if ((dp = rindex (cp, '.')) && *++dp)
1782: cp = dp;
1783: (void) sprintf (dp = buf1, "%*.*s",
1784: cp - buf2, cp - buf2, buf2);
1785: dp += strlen (dp);
1786: }
1787: else {
1788: (void) strcpy (buf1, buf2);
1789: dp = NULL;
1790: }
1791: newid = yp -> yp_ptrname ? yp -> yp_ptrname : id;
1792: if (h2flag && top)
1793: fprintf (fdef, "%*sint\tnelem;\n", level * 4, "");
1794: if (!top) {
1795: if (yp -> yp_structname)
1796: id = yp -> yp_structname;
1797: else if (!Hflag)
1798: id = gensym (ep, NULLCP);
1799: if (aflag)
1800: printag (yp, level + 4, NULLCP);
1801: fprintf (fdef, "%*sstruct %s {\n", level * 4, "", id);
1802: if (h2flag)
1803: fprintf (fdef, "%*sint\tnelem;\n", (level + 1) * 4, "");
1804: }
1805: if (dp)
1806: (void) strcpy (dp, newid);
1807: (void) strcpy (bp = buf2, id);
1808: bp += strlen (bp);
1809:
1810: if (!top)
1811: yp -> yp_declexp = new_string (id);
1812:
1813: if (dp)
1814: (void) strcpy (dp, newid);
1815: yp -> yp_varexp = new_string (buf1);
1816: if ((y = yp -> yp_type) -> yp_code == YP_IDEFINED && hflag) {
1817: modsym_aux (y -> yp_identifier, cp = buf3);
1818: if (h2flag) {
1819: cp += strlen(cp);
1820: (void) sprintf (cp, "[n_%s]", PARVAL (yp->yp_declexp));
1821: cp = buf3;
1822: }
1823: }
1824: else {
1825: switch (y -> yp_code) {
1826: case YP_SEQLIST:
1827: case YP_SETLIST:
1828: case YP_SETTYPE:
1829: case YP_SEQTYPE:
1830: case YP_CHOICE:
1831: case YP_IDEFINED:
1832: cp = gensym (ep, h2flag ? PARVAL(yp->yp_declexp) : NULLCP);
1833: break;
1834: default:
1835: cp = gensym (ep, NULLCP);
1836: break;
1837: }
1838: }
1839: (void) sprintf (bp, " -> %s", cp);
1840: if (fflag) {
1841: if (!top) {
1842: fprintf (fact, "%*s{\n", level * 4, "");
1843: level++;
1844: if (h2flag) {
1845: fprintf (fact, "%*sint n_%s;\n",
1846: level * 4, "", PARVAL (yp->yp_declexp));
1847: fprintf (fact, "%*sstruct %s *%s = %s;\n\n",
1848: level * 4, "", id, id, var);
1849: }
1850: else
1851: fprintf (fact, "%*sstruct %s *%s;\n\n",
1852: level * 4, "", id, id);
1853: }
1854: if (h2flag) {
1855: fprintf (fact, "%*sfor (n_%s = 0;\n",
1856: level * 4, "", PARVAL(yp -> yp_declexp));
1857: fprintf (fact, "%*sn_%s < %s -> nelem;\n",
1858: (level + 2) * 4, "", PARVAL(yp->yp_declexp), id);
1859: fprintf (fact, "%*sn_%s++) {\n",
1860: (level + 2) * 4, "", PARVAL(yp->yp_declexp));
1861: }
1862: else {
1863: fprintf (fact,
1864: "%*sfor (%s = %s; %s;) {\n",
1865: level * 4, "", id, buf1, id);
1866: fprintf (fact, "%*sstruct %s *f_%s = %s -> next;\n\n",
1867: (level + 1) * 4, "",
1868: top ? modsym (mymodule, val, "type") : id,
1869: id, id);
1870: }
1871: }
1872: level++;
1873: posy (y, 0, level, cp, ep, buf2, h2flag);
1874: *bp = NULL;
1875: if (y -> yp_code != YP_IDEFINED)
1876: free (cp);
1877: if (!h2flag)
1878: fprintf (fdef, "\n%*sstruct %s *next;\n", level * 4, "",
1879: top ? modsym (mymodule, val, "type") : id);
1880:
1881: level--;
1882:
1883: (void) strcpy (bp = buf2, var);
1884: bp += strlen (bp);
1885: if (fflag) {
1886: if (!h2flag) {
1887: fprintf (fact, "\n%*sif (%s)\n%*sfree ((char *) %s);",
1888: (level + 1) * 4, "", id,
1889: (level + 2) * 4, "", id);
1890: fprintf (fact, "\n%*s%s = f_%s;", (level + 1) * 4, "",
1891: id, id);
1892: }
1893: fprintf (fact, "\n%*s}\n", level * 4, "");
1894:
1895: if (!top) {
1896: if (h2flag)
1897: fprintf (fact, "\n%*s%s = NULL;\n",
1898: level * 4, "", var);
1899: else
1900: fprintf (fact, "\n%*s%s = NULL;\n",
1901: level * 4, "", yp -> yp_varexp);
1902:
1903: level--;
1904: fprintf (fact, "%*s}\n", level * 4, "");
1905: }
1906: }
1907:
1908: if (!top) {
1909: fprintf (fdef, "%*s} *%s;\n", level * 4, "",
1910: array(newid, arrayflg));
1911: if (!Hflag)
1912: free (id);
1913: }
1914: break;
1915:
1916: case YP_SEQLIST:
1917: case YP_SETLIST:
1918: ep = yp -> yp_code != YP_SETLIST ? "element" : "member";
1919: if ((cp = rindex (buf2, ' ')) && *++cp) {
1920: if ((dp = rindex (cp, '.')) && *++dp)
1921: cp = dp;
1922: (void) sprintf (dp = buf1, "%*.*s",
1923: cp - buf2, cp - buf2, buf2);
1924: dp += strlen (dp);
1925: }
1926: else {
1927: (void) strcpy (buf1, buf2);
1928: dp = NULL;
1929: }
1930: newid = yp -> yp_ptrname ? yp -> yp_ptrname : id;
1931: if (!top) {
1932: if (yp -> yp_structname)
1933: id = yp -> yp_structname;
1934: else if (!Hflag)
1935: id = gensym (ep, NULLCP);
1936: if (aflag)
1937: printag (yp, level + 4, NULLCP);
1938: fprintf (fdef, "%*sstruct %s {\n", level * 4, "", id);
1939:
1940: if (dp)
1941: (void) strcpy (dp, newid);
1942:
1943: if (fflag) {
1944: fprintf (fact, "%*sif (%s) {\n",
1945: level * 4, "", buf1);
1946: i = 0;
1947: for (y = yp -> yp_type; y; y = y -> yp_next) {
1948: switch (y -> yp_code) {
1949: case YP_BOOL:
1950: case YP_INT:
1951: case YP_INTLIST:
1952: case YP_ENUMLIST:
1953: case YP_REAL:
1954: case YP_NULL:
1955: continue;
1956:
1957: default:
1958: i = 1;
1959: break;
1960: }
1961: break;
1962: }
1963: if (i)
1964: fprintf (fact, "%*sstruct %s *%s = %s;\n\n",
1965: (level + 1) * 4, "", id, id, buf1);
1966: }
1967: (void) strcpy (bp = buf2, id);
1968: bp += strlen (bp);
1969: yp -> yp_declexp = new_string (id);
1970:
1971: level++;
1972: }
1973: if (dp)
1974: (void) strcpy (dp, newid);
1975: yp -> yp_varexp = new_string (buf1);
1976: for (y = yp -> yp_type, i = 0; y; y = y -> yp_next) {
1977: if (y -> yp_flags & YP_OPTIONAL)
1978: switch (y -> yp_code) {
1979: case YP_BOOL:
1980: case YP_INT:
1981: case YP_INTLIST:
1982: case YP_ENUMLIST:
1983: case YP_REAL:
1984: case YP_NULL:
1985: {
1986: char obuf[BUFSIZ];
1987:
1988: if (i == 0)
1989: fprintf (fdef, "%*sint optionals;\n",
1990: level * 4, "");
1991: if (y -> yp_flags & YP_ID)
1992: modsym_aux (y -> yp_id, cp = buf1);
1993: else {
1994: cp = gensym (ep, NULLCP);
1995: (void) strcpy (buf1, cp);
1996: free (cp);
1997: cp = buf1;
1998: }
1999: (void) sprintf (obuf, "%s_%s",
2000: modsym (mymodule,
2001: top ? eval : id,
2002: "opt"), cp);
2003: fprintf (fdef, "#define\t%s (0%08o)\n", obuf,
2004: 1 << i);
2005: y -> yp_optcontrol = new_string (obuf);
2006: y -> yp_flags |= YP_OPTCONTROL;
2007:
2008: i ++;
2009: if (i >= 8 * sizeof (int))
2010: yyerror ("too many optionals in structure");
2011: }
2012: break;
2013: }
2014: }
2015: if (i > 0) fprintf (fdef, "\n");
2016:
2017: for (y = yp -> yp_type, i = 1; y; y = y -> yp_next, i++) {
2018: if (y -> yp_flags & YP_ID)
2019: modsym_aux (y -> yp_id, cp = buf1);
2020: else
2021: cp = gensym (ep, NULLCP);
2022: (void) sprintf (bp, " -> %s", cp);
2023: posy (y, 0, level, cp, ep, buf2, 0);
2024: *bp = NULL;
2025: if (!(y -> yp_flags & YP_ID))
2026: free (cp);
2027: if (y -> yp_next)
2028: fprintf (fdef, "\n");
2029: }
2030: if (i == 1)
2031: fprintf (fdef, "%*schar dummy;\n", level * 4, "");
2032: if (!top) {
2033: level--;
2034:
2035: (void) strcpy (bp = buf2, var);
2036: bp += strlen (bp);
2037: if (fflag) {
2038: fprintf (fact, "\n%*sif (%s)\n%*sfree ((char *) %s);\n%*s%s = NULL;\n",
2039: (level + 1) * 4, "", yp -> yp_varexp,
2040: (level + 2) * 4, "", yp -> yp_varexp,
2041: (level + 1) * 4, "", yp -> yp_varexp);
2042: fprintf (fact, "%*s}\n", level * 4, "");
2043: }
2044:
2045: fprintf (fdef, "%*s} *%s;\n", level * 4, "",
2046: array(newid, arrayflg));
2047: if (!Hflag)
2048: free (id);
2049: }
2050: break;
2051:
2052: case YP_CHOICE:
2053: if ((cp = rindex (buf2, ' ')) && *++cp) {
2054: if ((dp = rindex (cp, '.')) && *++dp)
2055: cp = dp;
2056: (void) sprintf (dp = buf1, "%*.*s",
2057: cp - buf2, cp - buf2, buf2);
2058: dp += strlen (dp);
2059: }
2060: else {
2061: (void) strcpy (buf1, buf2);
2062: dp = NULL;
2063: }
2064: newid = yp -> yp_ptrname ? yp -> yp_ptrname : id;
2065: if (!top) {
2066: if (yp -> yp_structname)
2067: id = yp -> yp_structname;
2068: else if (!Hflag)
2069: id = gensym ("choice", NULLCP);
2070: if (aflag)
2071: printag (yp, level + 4, NULLCP);
2072: fprintf (fdef, "%*sstruct %s {\n", level * 4, "", id);
2073:
2074: if (dp)
2075: (void) strcpy (dp, newid);
2076: if (fflag) {
2077: fprintf (fact, "%*sif (%s) {\n%*sstruct %s *%s = %s;\n\n",
2078: level * 4, "", buf1,
2079: (level + 1) * 4, "", id, id, buf1);
2080: }
2081: (void) strcpy (bp = buf2, id);
2082: bp += strlen (bp);
2083: yp -> yp_declexp = new_string (id);
2084:
2085: level++;
2086: }
2087: if (dp)
2088: (void) strcpy (dp, newid);
2089: yp -> yp_varexp = new_string (buf1);
2090: fprintf (fdef, "%*sint offset;\n", level * 4, "");
2091: if (fflag)
2092: fprintf (fact, "%*sswitch (%s -> offset) {\n",
2093: level * 4, "", id);
2094: if (top)
2095: cp = modsym (mymodule, val, "type");
2096: else
2097: cp = id;
2098: (void) sprintf (ep = buf1, "%s_", cp);
2099: ep += strlen (ep);
2100: for (y = yp -> yp_type, i = 1; y; y = y -> yp_next, i++) {
2101: if (y -> yp_flags & YP_ID)
2102: modsym_aux (y -> yp_id, ep);
2103: else
2104: (void) sprintf (ep, "%d", i);
2105: y -> yp_offset = new_string (buf1);
2106: fprintf (fdef, "#define\t%s\t%d\n", y -> yp_offset, i);
2107: }
2108: fprintf (fdef, "\n%*sunion {\n", level * 4, "");
2109: level++;
2110: for (y = yp -> yp_type; y; y = y -> yp_next) {
2111: if (y -> yp_flags & YP_ID)
2112: modsym_aux (y -> yp_id, cp = buf1);
2113: else
2114: cp = gensym ("choice", NULLCP);
2115: if (fflag) {
2116: fprintf (fact, "%*scase %s:\n", level * 4, "",
2117: y -> yp_offset);
2118: level++;
2119: }
2120: (void) sprintf (bp, " -> un.%s", cp);
2121: posy (y, 0, level, cp, "choice", buf2, 0);
2122: *bp = NULL;
2123: if (fflag) {
2124: fprintf (fact, "%*sbreak;\n", level * 4, "");
2125: if (y -> yp_next)
2126: fprintf (fact, "\n");
2127: level--;
2128: }
2129: if (!(y -> yp_flags & YP_ID))
2130: free (cp);
2131: if (y -> yp_next)
2132: fprintf (fdef, "\n");
2133: }
2134: level--;
2135: fprintf (fdef, "%*s} un;\n", level * 4, "");
2136: if (fflag)
2137: fprintf (fact, "%*s}\n", level * 4, "");
2138: if (!top) {
2139: level--;
2140:
2141: (void) strcpy (bp = buf2, var);
2142: bp += strlen (bp);
2143: if (fflag) {
2144: fprintf (fact, "\n%*sif (%s)\n%*sfree ((char *) %s);\n%*s%s = NULL;\n",
2145: (level + 1) * 4, "", yp -> yp_varexp,
2146: (level + 2) * 4, "", yp -> yp_varexp,
2147: (level + 1) * 4, "", yp -> yp_varexp);
2148: fprintf (fact, "%*s}\n", level * 4, "");
2149: }
2150:
2151: fprintf (fdef, "%*s} *%s;\n", level * 4, "",
2152: array(newid, arrayflg));
2153: if (!Hflag)
2154: free (id);
2155: }
2156: break;
2157:
2158: case YP_OID:
2159: if (!top) {
2160: if (aflag)
2161: printag (yp, level + 4, NULLCP);
2162: fprintf (fdef, "%*sOID %s;\n", level * 4, "",
2163: array(id, arrayflg));
2164: }
2165: if (fflag) {
2166: fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
2167: fprintf (fact,
2168: "%*soid_free (%s),\n%*s%s = NULLOID;\n",
2169: (level + 1) * 4, "", buf2,
2170: (level + 2) * 4, "", buf2);
2171: }
2172: yp -> yp_varexp = new_string (buf2);
2173: break;
2174:
2175: case YP_IDEFINED:
2176: if (aflag)
2177: printag (yp, level + 4, NULLCP);
2178: fprintf (fdef, "%*sstruct %s *%s;\n", level * 4, "",
2179: modsym (yp -> yp_module, yp -> yp_identifier, "type"),
2180: array(id, arrayflg));
2181: if (fflag) {
2182: fprintf (fact, "%*sif (%s)\n", level * 4, "", buf2);
2183: fprintf (fact,
2184: "%*s%s (%s),\n%*s%s = NULL;\n",
2185: (level + 1) * 4, "",
2186: modsym (yp -> yp_module, yp -> yp_identifier, "free"),
2187: buf2, (level + 2) * 4, "", buf2);
2188: }
2189: yp -> yp_varexp = new_string (buf2);
2190: break;
2191:
2192: default:
2193: myyerror ("unknown type: %d", yp -> yp_code);
2194: }
2195: }
2196:
2197: /* */
2198:
2199: static printag (yp, level, pullup)
2200: register YP yp;
2201: int level;
2202: char *pullup;
2203: {
2204: fprintf (fdef, "%*s/* ", level * 4, "");
2205: switch (yp -> yp_code) {
2206: case YP_IDEFINED:
2207: if (yp -> yp_module && strcmp (yp -> yp_module, mymodule))
2208: fprintf (fdef, "%s.", yp -> yp_module);
2209: fprintf (fdef, "%s", yp -> yp_identifier);
2210: break;
2211:
2212: default:
2213: fprintf (fdef, "%s", tags[yp -> yp_code]);
2214: break;
2215: }
2216: if (pullup)
2217: fprintf (fdef, " pulled up from %s", pullup);
2218: fprintf (fdef, " */\n");
2219: }
2220:
2221: /* */
2222:
2223: static xalloc (yp, top, level, arg, type, brackets)
2224: register YP yp;
2225: int top,
2226: level,
2227: brackets;
2228: char *arg,
2229: *type;
2230: {
2231: int didone;
2232: register YP y;
2233:
2234: if (hflag && !arg && !type)
2235: return;
2236:
2237: didone = 0;
2238:
2239: if (arg && type) {
2240: if (brackets && !didone) {
2241: printf ("%*s%%{\n", level * 4, "");
2242: level++, didone++;
2243: }
2244:
2245: if (h2flag && (yp -> yp_code == YP_SEQTYPE ||
2246: yp -> yp_code == YP_SETTYPE)) {
2247: printf ("%*s{\n%*sPE xx_pe = prim2%s ($$);\n\n",
2248: level * 4, "", (level +1) * 4, "",
2249: yp -> yp_code == YP_SEQTYPE ? "seq" : "set");
2250: printf ("%*sn_%s = xx_pe -> pe_cardinal > 0 ",
2251: (level + 1) * 4, "", arg);
2252: printf ("? xx_pe -> pe_cardinal : 0;\n%*s}\n", level * 4, "");
2253: printf ("%*sif ((*(%s) = (struct %s *)\n",
2254: level * 4, "", arg, type);
2255: printf ("%*scalloc (1 + (unsigned) n_%s, sizeof **(%s)",
2256: (level + 2) * 4, "", arg, arg);
2257: printf (")) == ((struct %s *) 0)) {\n", type);
2258: printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n",
2259: (level + 1) * 4, "");
2260: printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
2261: level * 4, "");
2262: printf ("%*s(*%s) -> nelem = n_%s;\n", level * 4, "", arg, arg);
2263: printf ("%*sn_%s = 0;\n", level * 4, "", arg);
2264: } else {
2265: printf ("%*sif ((*(%s) = (struct %s *)\n",
2266: level * 4, "", arg, type);
2267: printf ("%*scalloc (1, sizeof **(%s))) == ((struct %s *) 0)) {\n",
2268: (level + 2) * 4, "", arg, type);
2269: printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n",
2270: (level + 1) * 4, "");
2271: printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
2272: level * 4, "");
2273: }
2274: }
2275: switch (yp -> yp_code) {
2276: case YP_SEQTYPE:
2277: case YP_SETTYPE:
2278: if (top) break;
2279: case YP_CHOICE:
2280: case YP_SEQLIST:
2281: case YP_SETLIST:
2282: for (y = yp -> yp_type; y; y = y -> yp_next)
2283: switch (y -> yp_code) {
2284: case YP_SEQTYPE:
2285: case YP_SETTYPE:
2286: if (h2flag && (yp -> yp_code == YP_SETLIST ||
2287: yp -> yp_code == YP_SEQLIST)) {
2288: /* include allocation here - no chance later */
2289: if (brackets && !didone) {
2290: printf ("%*s%%{\n", level * 4, "");
2291: level++, didone++;
2292: }
2293: if (y -> yp_declexp)
2294: printf ("%*s%s = &(%s);\n", level * 4, "",
2295: y -> yp_declexp,
2296: y -> yp_varexp);
2297: xalloc (y, top, level, y -> yp_declexp,
2298: y -> yp_declexp, 0);
2299: }
2300: /* and continue ... */
2301: case YP_SEQLIST:
2302: case YP_SETLIST:
2303: case YP_CHOICE:
2304: if (brackets && !didone) {
2305: printf ("%*s%%{\n", level * 4, "");
2306: level++, didone++;
2307: }
2308: printf ("%*s%s = &(%s);\n",
2309: level * 4, "", y -> yp_declexp,
2310: y -> yp_varexp);
2311: break;
2312: }
2313: break;
2314: }
2315:
2316: if (brackets && didone) {
2317: level--;
2318: printf ("%*s%%}\n", level * 4, "");
2319: }
2320: }
2321:
2322:
2323: static balloc (yp, var, action2, level)
2324: register YP yp;
2325: char *var, *action2;
2326: int level;
2327: {
2328: printf ("\n%*s%%{\n", level * 4, "");
2329: level++;
2330:
2331: printf ("%*sif ((%s%s = prim2bit (pe_cpy ($$))) == NULLPE) {\n",
2332: level * 4, "", var, SVAL (yp -> yp_varexp));
2333: printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n", (level + 1) * 4, "");
2334: printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "", level * 4, "");
2335:
2336: if (action2)
2337: printf ("\n%*s%s\n", level * 4, "", action2);
2338:
2339: level--;
2340: printf ("%*s%%}", level * 4, "");
2341: }
2342:
2343: #ifdef notdef
2344: static qalloc (yp, var, action2, level)
2345: register YP yp;
2346: char *var,
2347: *action2;
2348: int level;
2349: {
2350: printf ("\n%*s%%{\n", level * 4, "");
2351: level++;
2352:
2353: printf ("%*sif ((%s%s = str2qb ($$, $$_len, 1)) == ((struct qbuf *) 0)) {\n",
2354: level * 4, "", var, SVAL (yp -> yp_varexp));
2355: printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_NOMEM);\n", (level + 1) * 4, "");
2356: printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "", level * 4, "");
2357:
2358: if (action2)
2359: printf ("\n%*s%s\n", level * 4, "", action2);
2360:
2361: level--;
2362: printf ("%*s%%}", level * 4, "");
2363: }
2364: #endif
2365:
2366: /* */
2367:
2368: static choice_pullup (yp, partial)
2369: register YP yp;
2370: int partial;
2371: {
2372: register YP *x,
2373: y,
2374: z,
2375: *z1,
2376: z2,
2377: z3;
2378:
2379: for (x = &yp -> yp_type; y = *x; x = &y -> yp_next) {
2380: if (y -> yp_flags & (YP_TAG | YP_BOUND))
2381: continue;
2382:
2383: switch (y -> yp_code) {
2384: case YP_IDEFINED:
2385: if ((z = lookup_type (y -> yp_module, y -> yp_identifier))
2386: == NULLYP
2387: || z -> yp_code != YP_CHOICE)
2388: continue;
2389: choice_pullup (z2 = copy_type (z), CH_FULLY);
2390: goto patch;
2391:
2392: case YP_CHOICE:
2393: choice_pullup (z2 = copy_type (y), CH_FULLY);
2394: patch: ;
2395: if (partial) {
2396: *x = z2;
2397: z2 -> yp_next = y -> yp_next;
2398: continue;
2399: }
2400: break;
2401:
2402: default:
2403: continue;
2404: }
2405: z = z3 = z2 -> yp_type;
2406: for (z1 = &z -> yp_next; z2 = *z1; z1 = &z2 -> yp_next)
2407: z3 = z2;
2408: *z1 = y -> yp_next;
2409: *x = z;
2410: y = z3;
2411: }
2412: }
2413:
2414: /* */
2415:
2416: static components_pullup (yp)
2417: register YP yp;
2418: {
2419: register YP *x,
2420: y,
2421: z,
2422: z1,
2423: z2;
2424:
2425: for (x = &yp -> yp_type; y = *x; x = &y -> yp_next) {
2426: if (!(y -> yp_flags & YP_COMPONENTS))
2427: continue;
2428:
2429: switch (y -> yp_code) {
2430: case YP_SEQLIST:
2431: case YP_SETLIST:
2432: z = y;
2433: break;
2434:
2435: case YP_IDEFINED:
2436: if ((z = lookup_type (y -> yp_module, y -> yp_identifier))
2437: == NULLYP) {
2438: warning ("COMPONENTS OF target \"%s\" is undefined",
2439: y -> yp_identifier);
2440: continue;
2441: }
2442: break;
2443: }
2444: if (yp -> yp_code != z -> yp_code) {
2445: warning ("COMPONENTS OF target \"%s\" is wrong type, should be %s",
2446: y -> yp_code == YP_IDEFINED ? y -> yp_identifier
2447: : y -> yp_id ? y -> yp_id
2448: : "",
2449: yp -> yp_code == YP_SEQLIST ? "SEQUENCE" : "SET");
2450: continue;
2451: }
2452: if (z -> yp_type == NULLYP)
2453: continue;
2454: components_pullup (z = copy_type (z));
2455: *x = z2 = z -> yp_type;
2456: for (x = &z -> yp_type; z1 = *x; x = &z1 -> yp_next)
2457: z2 = z1;
2458: *x = y -> yp_next;
2459: y = z2;
2460: }
2461: }
2462:
2463: /* VALUE HANDLING */
2464:
2465: static int val2int (yv)
2466: register YV yv;
2467: {
2468: switch (yv -> yv_code) {
2469: case YV_BOOL:
2470: case YV_NUMBER:
2471: return yv -> yv_number;
2472:
2473: case YV_STRING:
2474: yyerror ("need an integer, not a string");
2475:
2476: case YV_IDEFINED:
2477: case YV_IDLIST:
2478: yyerror ("haven't written symbol table for values yet");
2479:
2480: case YV_NULL:
2481: yyerror ("need an integer, not NULL");
2482:
2483: default:
2484: myyerror ("unknown value: %d", yv -> yv_code);
2485: }
2486: /* NOTREACHED */
2487: }
2488:
2489: static double val2real (yv)
2490: register YV yv;
2491: {
2492: switch (yv -> yv_code) {
2493: case YV_NUMBER:
2494: return yv -> yv_number;
2495:
2496: case YV_REAL:
2497: return yv -> yv_real;
2498:
2499: case YV_STRING:
2500: yyerror ("need an integer, not a string");
2501:
2502: case YV_IDEFINED:
2503: case YV_IDLIST:
2504: yyerror ("haven't written symbol table for values yet");
2505:
2506: case YV_NULL:
2507: yyerror ("need an integer, not NULL");
2508:
2509: default:
2510: myyerror ("unknown value: %d", yv -> yv_code);
2511: }
2512: /* NOTREACHED */
2513: }
2514:
2515: /* */
2516:
2517: static val2prf (yv, level)
2518: register YV yv;
2519: int level;
2520: {
2521: register YV y;
2522:
2523: if (yv -> yv_flags & YV_ID)
2524: printf ("%s ", yv -> yv_id);
2525:
2526: if (yv -> yv_flags & YV_TYPE) /* will this REALLY work??? */
2527: do_type1 (yv -> yv_type, 0, level, NULLCP, NULLCP, NULLCP, NULL);
2528:
2529: switch (yv -> yv_code) {
2530: case YV_BOOL:
2531: printf (yv -> yv_number ? "TRUE" : "FALSE");
2532: break;
2533:
2534: case YV_NUMBER:
2535: if (yv -> yv_named)
2536: printf ("%s", yv -> yv_named);
2537: else
2538: printf ("%d", yv -> yv_number);
2539: break;
2540:
2541: case YV_REAL:
2542: dump_real (yv -> yv_real);
2543: break;
2544:
2545: case YV_STRING:
2546: printf ("\"%s\"", yv -> yv_string);
2547: break;
2548:
2549: case YV_IDEFINED:
2550: if (yv -> yv_module)
2551: printf ("%s.", yv -> yv_module);
2552: printf ("%s", yv -> yv_identifier);
2553: break;
2554:
2555: case YV_IDLIST:
2556: case YV_VALIST:
2557: printf ("{");
2558: for (y = yv -> yv_idlist; y; y = y -> yv_next) {
2559: printf (" ");
2560: val2prf (y, level + 1);
2561: printf (y -> yv_next ? ", " : " ");
2562: }
2563: printf ("}");
2564: break;
2565:
2566: case YV_NULL:
2567: printf ("NULL");
2568: break;
2569:
2570: default:
2571: myyerror ("unknown value: %d", yv -> yv_code);
2572: /* NOTREACHED */
2573: }
2574: }
2575: static dump_real (r)
2576: double r;
2577: {
2578: #ifndef BSD44
2579: extern char *ecvt ();
2580: char *cp;
2581: char sbuf[128];
2582: int decpt, sign;
2583:
2584: cp = ecvt (r, 20, &decpt, &sign);
2585: (void) strcpy (sbuf, cp); /* cp gets overwritten by printf */
2586: printf ("{ %s%s, 10, %d }", sign ? "-" : "", sbuf,
2587: decpt - strlen (sbuf));
2588: #else
2589: register char *cp,
2590: *dp,
2591: *sp;
2592: char sbuf[128];
2593:
2594: (void) sprintf (sbuf, "%.19e", r);
2595: if (*(dp = sbuf) == '-')
2596: sp = "-", dp++;
2597: else
2598: sp = "";
2599:
2600: if (dp[1] != '.' || (cp = index (dp, 'e')) == NULL) {
2601: printf ("{ 0, 10, 0 } -- %s --", sbuf);
2602: return;
2603: }
2604: *cp++ = NULL;
2605: printf ("{ %s%c%s, 10, %d }",
2606: sp, *dp, dp + 2, atoi (cp) - strlen (dp + 2));
2607: #endif
2608: }
2609:
2610: /* */
2611:
2612: static int dfl2int (yp)
2613: register YP yp;
2614: {
2615: register YV yv,
2616: y;
2617:
2618: yv = yp -> yp_default;
2619: switch (yv -> yv_code) {
2620: case YV_BOOL:
2621: case YV_NUMBER:
2622: return yv -> yv_number;
2623:
2624: case YV_STRING:
2625: yyerror ("need an integer, not a string");
2626:
2627: case YV_REAL:
2628: yyerror ("need an integer, not a real");
2629:
2630: case YV_IDEFINED:
2631: for (y = yp -> yp_value; y; y = y -> yv_next)
2632: if (y -> yv_code == YV_NUMBER
2633: && (y -> yv_flags & YV_NAMED)
2634: && strcmp (yv -> yv_identifier, y -> yv_named) == 0)
2635: return y -> yv_number;
2636: /* and fall */
2637:
2638: case YV_IDLIST:
2639: yyerror ("haven't written symbol table for values yet");
2640:
2641: case YV_NULL:
2642: yyerror ("need an integer, not NULL");
2643:
2644: default:
2645: myyerror ("unknown value: %d", yv -> yv_code);
2646: }
2647: /* NOTREACHED */
2648: }
2649:
2650: /* DEBUG */
2651:
2652: print_type (yp, level)
2653: register YP yp;
2654: register int level;
2655: {
2656: register YP y;
2657: register YV yv;
2658:
2659: if (yp == NULLYP)
2660: return;
2661:
2662: fprintf (stderr, "%*scode=0x%x flags=%s direction=0x%x\n", level * 4, "",
2663: yp -> yp_code, sprintb (yp -> yp_flags, YPBITS),
2664: yp -> yp_direction);
2665: fprintf (stderr,
2666: "%*sintexp=\"%s\" strexp=\"%s\" prfexp=0%o declexp=\"%s\" varexp=\"%s\"\n",
2667: level * 4, "", yp -> yp_intexp, yp -> yp_strexp, yp -> yp_prfexp,
2668: yp -> yp_declexp, yp -> yp_varexp);
2669: if (yp -> yp_param_type)
2670: fprintf (stderr, "%*sparameter type=\"%s\"\n", level * 4, "",
2671: yp -> yp_param_type);
2672: if (yp -> yp_action0)
2673: fprintf (stderr, "%*saction0 at line %d=\"%s\"\n", level * 4, "",
2674: yp -> yp_act0_lineno, yp -> yp_action0);
2675: if (yp -> yp_action05)
2676: fprintf (stderr, "%*saction05 at line %d=\"%s\"\n", level * 4, "",
2677: yp -> yp_act05_lineno, yp -> yp_action05);
2678: if (yp -> yp_action1)
2679: fprintf (stderr, "%*saction1 at line %d=\"%s\"\n", level * 4, "",
2680: yp -> yp_act1_lineno, yp -> yp_action1);
2681: if (yp -> yp_action2)
2682: fprintf (stderr, "%*saction2 at line %d=\"%s\"\n", level * 4, "",
2683: yp -> yp_act2_lineno, yp -> yp_action2);
2684: if (yp -> yp_action3)
2685: fprintf (stderr, "%*saction3 at line %d=\"%s\"\n", level * 4, "",
2686: yp -> yp_act3_lineno, yp -> yp_action3);
2687:
2688: if (yp -> yp_flags & YP_TAG) {
2689: fprintf (stderr, "%*stag class=0x%x value=0x%x\n", level * 4, "",
2690: yp -> yp_tag -> yt_class, yp -> yp_tag -> yt_value);
2691: print_value (yp -> yp_tag -> yt_value, level + 1);
2692: }
2693:
2694: if (yp -> yp_flags & YP_DEFAULT) {
2695: fprintf (stderr, "%*sdefault=0x%x\n", level * 4, "", yp -> yp_default);
2696: print_value (yp -> yp_default, level + 1);
2697: }
2698:
2699: if (yp -> yp_flags & YP_ID)
2700: fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yp -> yp_id);
2701:
2702: if (yp -> yp_flags & YP_BOUND)
2703: fprintf (stderr, "%*sbound=\"%s\"\n", level * 4, "", yp -> yp_bound);
2704:
2705: if (yp -> yp_offset)
2706: fprintf (stderr, "%*soffset=\"%s\"\n", level * 4, "", yp -> yp_offset);
2707:
2708: switch (yp -> yp_code) {
2709: case YP_INTLIST:
2710: case YP_ENUMLIST:
2711: case YP_BITLIST:
2712: fprintf (stderr, "%*svalue=0x%x\n", level * 4, "", yp -> yp_value);
2713: for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
2714: print_value (yv, level + 1);
2715: fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
2716: }
2717: break;
2718:
2719: case YP_SEQTYPE:
2720: case YP_SEQLIST:
2721: case YP_SETTYPE:
2722: case YP_SETLIST:
2723: case YP_CHOICE:
2724: fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yp -> yp_type);
2725: for (y = yp -> yp_type; y; y = y -> yp_next) {
2726: print_type (y, level + 1);
2727: fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
2728: }
2729: break;
2730:
2731: case YP_IDEFINED:
2732: fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
2733: level * 4, "", yp -> yp_module ? yp -> yp_module : "",
2734: yp -> yp_identifier);
2735: break;
2736:
2737: default:
2738: break;
2739: }
2740: }
2741:
2742: /* */
2743:
2744: static print_value (yv, level)
2745: register YV yv;
2746: register int level;
2747: {
2748: register YV y;
2749:
2750: if (yv == NULLYV)
2751: return;
2752:
2753: fprintf (stderr, "%*scode=0x%x flags=%s\n", level * 4, "",
2754: yv -> yv_code, sprintb (yv -> yv_flags, YVBITS));
2755:
2756: if (yv -> yv_action)
2757: fprintf (stderr, "%*saction at line %d=\"%s\"\n", level * 4, "",
2758: yv -> yv_act_lineno, yv -> yv_action);
2759:
2760: if (yv -> yv_flags & YV_ID)
2761: fprintf (stderr, "%*sid=\"%s\"\n", level * 4, "", yv -> yv_id);
2762:
2763: if (yv -> yv_flags & YV_NAMED)
2764: fprintf (stderr, "%*snamed=\"%s\"\n", level * 4, "", yv -> yv_named);
2765:
2766: if (yv -> yv_flags & YV_TYPE) {
2767: fprintf (stderr, "%*stype=0x%x\n", level * 4, "", yv -> yv_type);
2768: print_type (yv -> yv_type, level + 1);
2769: }
2770:
2771: switch (yv -> yv_code) {
2772: case YV_NUMBER:
2773: case YV_BOOL:
2774: fprintf (stderr, "%*snumber=0x%x\n", level * 4, "",
2775: yv -> yv_number);
2776: break;
2777:
2778: case YV_STRING:
2779: fprintf (stderr, "%*sstring=0x%x\n", level * 4, "",
2780: yv -> yv_string);
2781: break;
2782:
2783: case YV_IDEFINED:
2784: if (yv -> yv_flags & YV_BOUND)
2785: fprintf (stderr, "%*smodule=\"%s\" identifier=\"%s\"\n",
2786: level * 4, "", yv -> yv_module, yv -> yv_identifier);
2787: else
2788: fprintf (stderr, "%*sbound identifier=\"%s\"\n",
2789: level * 4, "", yv -> yv_identifier);
2790: break;
2791:
2792: case YV_IDLIST:
2793: case YV_VALIST:
2794: for (y = yv -> yv_idlist; y; y = y -> yv_next) {
2795: print_value (y, level + 1);
2796: fprintf (stderr, "%*s----\n", (level + 1) * 4, "");
2797: }
2798: break;
2799:
2800: default:
2801: break;
2802: }
2803: }
2804:
2805: /* SYMBOLS */
2806:
2807: static SY new_symbol (encpref, decpref, prfpref, mod, id, type)
2808: register char *encpref,
2809: *decpref,
2810: *prfpref,
2811: *mod,
2812: *id;
2813: register YP type;
2814: {
2815: register SY sy;
2816:
2817: if ((sy = (SY) calloc (1, sizeof *sy)) == NULLSY)
2818: yyerror ("out of memory");
2819: sy -> sy_encpref = encpref;
2820: sy -> sy_decpref = decpref;
2821: sy -> sy_prfpref = prfpref;
2822: sy -> sy_module = mod;
2823: sy -> sy_name = id;
2824: sy -> sy_type = type;
2825:
2826: return sy;
2827: }
2828:
2829:
2830: static SY add_symbol (s1, s2)
2831: register SY s1,
2832: s2;
2833: {
2834: register SY sy;
2835:
2836: if (s1 == NULLSY)
2837: return s2;
2838:
2839: for (sy = s1; sy -> sy_next; sy = sy -> sy_next)
2840: continue;
2841: sy -> sy_next = s2;
2842:
2843: return s1;
2844: }
2845:
2846: /* MODULES */
2847:
2848: static MD lookup_module (module)
2849: char *module;
2850: {
2851: register MD md;
2852:
2853: for (md = mymodules; md; md = md -> md_next)
2854: if (strcmp (md -> md_module, module) == 0)
2855: return md;
2856:
2857: if ((md = (MD) calloc (1, sizeof *md)) == NULLMD)
2858: yyerror ("out of memory");
2859: md -> md_module = new_string (module);
2860:
2861: if (mymodules != NULLMD)
2862: md -> md_next = mymodules;
2863: mymodules = md;
2864:
2865: return NULLMD;
2866: }
2867:
2868: /* TYPES */
2869:
2870: YP new_type (code)
2871: int code;
2872: {
2873: register YP yp;
2874:
2875: if ((yp = (YP) calloc (1, sizeof *yp)) == NULLYP)
2876: yyerror ("out of memory");
2877: yp -> yp_code = code;
2878:
2879: return yp;
2880: }
2881:
2882:
2883: YP add_type (y, z)
2884: register YP y,
2885: z;
2886: {
2887: register YP yp;
2888:
2889: for (yp = y; yp -> yp_next; yp = yp -> yp_next)
2890: continue;
2891: yp -> yp_next = z;
2892:
2893: return y;
2894: }
2895:
2896: /* */
2897:
2898: YP copy_type (yp)
2899: register YP yp;
2900: {
2901: register YP y;
2902:
2903: if (yp == NULLYP)
2904: return NULLYP;
2905:
2906: y = new_type (yp -> yp_code);
2907: y -> yp_direction = yp -> yp_direction;
2908:
2909: switch (yp -> yp_code) {
2910: case YP_IDEFINED:
2911: if (yp -> yp_module)
2912: y -> yp_module = new_string (yp -> yp_module);
2913: y -> yp_identifier = new_string (yp -> yp_identifier);
2914: y -> yp_modid = oid_cpy (yp -> yp_modid);
2915: break;
2916:
2917: case YP_SEQTYPE:
2918: case YP_SEQLIST:
2919: case YP_SETTYPE:
2920: case YP_SETLIST:
2921: case YP_CHOICE:
2922: y -> yp_type = copy_type (yp -> yp_type);
2923: break;
2924:
2925: case YP_INTLIST:
2926: case YP_ENUMLIST:
2927: case YP_BITLIST:
2928: y -> yp_value = copy_value (yp -> yp_value);
2929: break;
2930:
2931: default:
2932: break;
2933: }
2934:
2935: y -> yp_intexp = yp -> yp_intexp;
2936: y -> yp_strexp = yp -> yp_strexp;
2937: y -> yp_prfexp = yp -> yp_prfexp;
2938:
2939: y -> yp_declexp = yp -> yp_declexp;
2940: y -> yp_varexp = yp -> yp_varexp;
2941:
2942: if (yp -> yp_structname)
2943: y -> yp_structname = new_string (yp -> yp_structname);
2944: if (yp -> yp_ptrname)
2945: y -> yp_ptrname = new_string (yp -> yp_ptrname);
2946:
2947: if (yp -> yp_param_type)
2948: y -> yp_param_type = new_string (yp -> yp_param_type);
2949:
2950: if (yp -> yp_action0) {
2951: y -> yp_action0 = new_string (yp -> yp_action0);
2952: y -> yp_act0_lineno = yp -> yp_act0_lineno;
2953: }
2954:
2955: if (yp -> yp_action05) {
2956: y -> yp_action05 = new_string (yp -> yp_action05);
2957: y -> yp_act05_lineno = yp -> yp_act05_lineno;
2958: }
2959:
2960: if (yp -> yp_action1) {
2961: y -> yp_action1 = new_string (yp -> yp_action1);
2962: y -> yp_act1_lineno = yp -> yp_act1_lineno;
2963: }
2964:
2965: if (yp -> yp_action2) {
2966: y -> yp_action2 = new_string (yp -> yp_action2);
2967: y -> yp_act2_lineno = yp -> yp_act2_lineno;
2968: }
2969:
2970: if (yp -> yp_action3) {
2971: y -> yp_action3 = new_string (yp -> yp_action3);
2972: y -> yp_act3_lineno = yp -> yp_act3_lineno;
2973: }
2974:
2975: y -> yp_flags = yp -> yp_flags;
2976:
2977: if (yp -> yp_flags & YP_DEFAULT)
2978: y -> yp_default = copy_value (yp -> yp_default);
2979:
2980: if (yp -> yp_flags & YP_ID)
2981: y -> yp_id = new_string (yp -> yp_id);
2982:
2983: if (yp -> yp_flags & YP_TAG)
2984: y -> yp_tag = copy_tag (yp -> yp_tag);
2985:
2986: if (yp -> yp_flags & YP_BOUND)
2987: y -> yp_bound = new_string (yp -> yp_bound);
2988:
2989: if (yp -> yp_flags & YP_PARMVAL)
2990: y -> yp_parm = new_string (yp -> yp_parm);
2991:
2992: if (yp -> yp_flags & YP_CONTROLLED)
2993: y -> yp_control = new_string (yp -> yp_control);
2994:
2995: if (yp -> yp_flags & YP_OPTCONTROL)
2996: y -> yp_optcontrol = new_string (yp -> yp_optcontrol);
2997:
2998: if (yp -> yp_offset)
2999: y -> yp_offset = new_string (yp -> yp_offset);
3000:
3001: if (yp -> yp_next)
3002: y -> yp_next = copy_type (yp -> yp_next);
3003:
3004: return y;
3005: }
3006:
3007: /* VALUES */
3008:
3009: YV new_value (code)
3010: int code;
3011: {
3012: register YV yv;
3013:
3014: if ((yv = (YV) calloc (1, sizeof *yv)) == NULLYV)
3015: yyerror ("out of memory");
3016: yv -> yv_code = code;
3017:
3018: return yv;
3019: }
3020:
3021:
3022: YV add_value (y, z)
3023: register YV y,
3024: z;
3025: {
3026: register YV yv;
3027:
3028: for (yv = y; yv -> yv_next; yv = yv -> yv_next)
3029: continue;
3030: yv -> yv_next = z;
3031:
3032: return y;
3033: }
3034:
3035: /* */
3036:
3037: YV copy_value (yv)
3038: register YV yv;
3039: {
3040: register YV y;
3041:
3042: if (yv == NULLYV)
3043: return NULLYV;
3044:
3045: y = new_value (yv -> yv_code);
3046: y -> yv_flags = yv -> yv_flags;
3047:
3048: if (yv -> yv_action) {
3049: y -> yv_action = new_string (yv -> yv_action);
3050: y -> yv_act_lineno = yv -> yv_act_lineno;
3051: }
3052:
3053: if (yv -> yv_flags & YV_ID)
3054: y -> yv_id = new_string (yv -> yv_id);
3055:
3056: if (yv -> yv_flags & YV_NAMED)
3057: y -> yv_named = new_string (yv -> yv_named);
3058:
3059: if (yv -> yv_flags & YV_TYPE)
3060: y -> yv_type = copy_type (yv -> yv_type);
3061:
3062: switch (yv -> yv_code) {
3063: case YV_NUMBER:
3064: case YV_BOOL:
3065: y -> yv_number = yv -> yv_number;
3066: break;
3067:
3068: case YV_STRING:
3069: y -> yv_string = new_string (yv -> yv_string);
3070: break;
3071:
3072: case YV_IDEFINED:
3073: if (yv -> yv_module)
3074: y -> yv_module = new_string (yv -> yv_module);
3075: y -> yv_identifier = new_string (yv -> yv_identifier);
3076: break;
3077:
3078: case YV_IDLIST:
3079: case YV_VALIST:
3080: y -> yv_idlist = copy_value (yv -> yv_idlist);
3081: break;
3082:
3083: default:
3084: break;
3085: }
3086:
3087: if (yv -> yv_next)
3088: y -> yv_next = copy_value (yv -> yv_next);
3089:
3090: return y;
3091: }
3092:
3093: /* TAGS */
3094:
3095: YT new_tag (class)
3096: PElementClass class;
3097: {
3098: register YT yt;
3099:
3100: if ((yt = (YT) calloc (1, sizeof *yt)) == NULLYT)
3101: yyerror ("out of memory");
3102: yt -> yt_class = class;
3103:
3104: return yt;
3105: }
3106:
3107: /* */
3108:
3109: YT copy_tag (yt)
3110: register YT yt;
3111: {
3112: register YT y;
3113:
3114: if (yt == NULLYT)
3115: return NULLYT;
3116:
3117: y = new_tag (yt -> yt_class);
3118:
3119: y -> yt_value = copy_value (yt -> yt_value);
3120:
3121: return y;
3122: }
3123:
3124: /* STRINGS */
3125:
3126: char *new_string (s)
3127: register char *s;
3128: {
3129: register char *p;
3130:
3131: if ((p = malloc ((unsigned) (strlen (s) + 1))) == NULLCP)
3132: yyerror ("out of memory");
3133:
3134: (void) strcpy (p, s);
3135: return p;
3136: }
3137:
3138: /* SYMBOLS */
3139:
3140: static struct triple {
3141: char *t_name;
3142: PElementClass t_class;
3143: PElementID t_id;
3144: } triples[] = {
3145: "IA5String", PE_CLASS_UNIV, PE_DEFN_IA5S,
3146: "ISO646String", PE_CLASS_UNIV, PE_DEFN_IA5S,
3147: "NumericString", PE_CLASS_UNIV, PE_DEFN_NUMS,
3148: "PrintableString", PE_CLASS_UNIV, PE_DEFN_PRTS,
3149: "T61String", PE_CLASS_UNIV, PE_DEFN_T61S,
3150: "TeletexString", PE_CLASS_UNIV, PE_DEFN_T61S,
3151: "VideotexString", PE_CLASS_UNIV, PE_DEFN_VTXS,
3152: "GeneralizedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
3153: "GeneralisedTime", PE_CLASS_UNIV, PE_DEFN_GENT,
3154: "UTCTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
3155: "UniversalTime", PE_CLASS_UNIV, PE_DEFN_UTCT,
3156: "GraphicString", PE_CLASS_UNIV, PE_DEFN_GFXS,
3157: "VisibleString", PE_CLASS_UNIV, PE_DEFN_VISS,
3158: "GeneralString", PE_CLASS_UNIV, PE_DEFN_GENS,
3159: "EXTERNAL", PE_CLASS_UNIV, PE_CONS_EXTN,
3160: "ObjectDescriptor", PE_CLASS_UNIV, PE_PRIM_ODE,
3161:
3162: NULL
3163: };
3164:
3165: /* */
3166:
3167: static char *modsym (module, id, prefix)
3168: register char *module,
3169: *id;
3170: char *prefix;
3171: {
3172: char buf1[BUFSIZ],
3173: buf2[BUFSIZ],
3174: buf3[BUFSIZ];
3175: register struct triple *t;
3176: static char buffer[BUFSIZ];
3177:
3178: if (module == NULLCP)
3179: for (t = triples; t -> t_name; t++)
3180: if (strcmp (t -> t_name, id) == 0) {
3181: module = "UNIV";
3182: break;
3183: }
3184:
3185: if (prefix)
3186: modsym_aux (prefix, buf1);
3187: modsym_aux (module ? module : mymodule, buf2);
3188: modsym_aux (id, buf3);
3189: if (prefix)
3190: (void) sprintf (buffer, "%s_%s_%s", buf1, buf2, buf3);
3191: else
3192: (void) sprintf (buffer, "%s_%s", buf2, buf3);
3193:
3194: return buffer;
3195: }
3196:
3197:
3198: static modsym_aux (name, bp)
3199: register char *name,
3200: *bp;
3201: {
3202: register char c;
3203:
3204: while (c = *name++)
3205: switch (c) {
3206: case '-':
3207: *bp++ = '_';
3208: *bp++ = '_';
3209: break;
3210:
3211: default:
3212: *bp++ = c;
3213: break;
3214: }
3215:
3216: *bp = NULL;
3217: }
3218:
3219: /* */
3220:
3221: static char *gensym (s, a)
3222: char *s, *a;
3223: {
3224: int i;
3225: register char *p;
3226: char buffer[BUFSIZ];
3227: static int cP = 0;
3228: static int eP = 0;
3229: static int mP = 0;
3230:
3231: switch (*s) {
3232: case 'c':
3233: i = cP++;
3234: break;
3235: case 'e':
3236: i = eP++;
3237: break;
3238: case 'm':
3239: i = mP++;
3240: break;
3241:
3242: default:
3243: myyerror ("unknown gensym argument \"%s\"", s);
3244: /* NOTREACHED */
3245: }
3246: if (a)
3247: (void) sprintf (buffer, "%s_%s_%d[n_%s]", s, modulename, i, a);
3248: else
3249: (void) sprintf (buffer, "%s_%s_%d", s, modulename, i);
3250:
3251: if ((p = malloc ((unsigned) (strlen (buffer) + 11))) == NULLCP)
3252: yyerror ("out of memory");
3253:
3254: (void) strcpy (p, buffer);
3255: return p;
3256: }
3257:
3258: /* pepy compatible routines - you know how it is ... */
3259: init_new_file ()
3260: {
3261: ;
3262: }
3263:
3264: end_file ()
3265: {
3266: ;
3267: }
3268:
3269: static char *array (s, flg)
3270: char *s;
3271: int flg;
3272: {
3273: static char buf[BUFSIZ];
3274: char *p;
3275:
3276: if (!flg) return s;
3277:
3278: if (p = index (s, '[')) {
3279: (void) sprintf (buf, "%*.*s[1]", p - s, p - s, s);
3280: return buf;
3281: }
3282: return s;
3283: }
3284:
3285: static void prime_default (yp, level)
3286: YP yp;
3287: int level;
3288: {
3289: switch (yp -> yp_code) {
3290: case YP_BOOL:
3291: printf ("%*s%s = %d;\n", level * 4, "",
3292: SVAL (yp->yp_varexp),
3293: val2int (yp -> yp_default) ? 1 : 0);
3294: break;
3295:
3296: case YP_INT:
3297: printf ("%*s%s = %d;\n", level * 4, "",
3298: SVAL (yp -> yp_varexp), val2int (yp -> yp_default));
3299: break;
3300:
3301: case YP_INTLIST:
3302: case YP_ENUMLIST:
3303: printf ("%*s%s = %d;\n", level * 4, "",
3304: SVAL (yp -> yp_varexp), dfl2int (yp));
3305: break;
3306:
3307: case YP_REAL:
3308: printf ("%*s%s = %g;\n", level * 4, "",
3309: SVAL (yp -> yp_varexp),
3310: val2real (yp -> yp_default));
3311:
3312: default:
3313: break;
3314: }
3315: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.