BSD 4_3_Net_2 release
[unix-history] / usr / src / contrib / isode / pepy / pepy_do.c
CommitLineData
9e8e5516
C
1/* pepy_do.c - PE parser (yacc-based) building routines */
2
3#ifndef lint
4static char *rcsid = "$Header: /f/osi/pepy/RCS/pepy_do.c,v 7.3 91/02/22 09:35:04 mrose Interim $";
5#endif
6
7/*
8 * $Header: /f/osi/pepy/RCS/pepy_do.c,v 7.3 91/02/22 09:35:04 mrose Interim $
9 *
10 *
11 * $Log: pepy_do.c,v $
12 * Revision 7.3 91/02/22 09:35:04 mrose
13 * Interim 6.8
14 *
15 * Revision 7.2 90/10/29 18:38:20 mrose
16 * updates
17 *
18 * Revision 7.1 90/10/23 20:42:42 mrose
19 * update
20 *
21 * Revision 7.0 89/11/23 22:11:49 mrose
22 * Release 6.0
23 *
24 */
25
26/*
27 * NOTICE
28 *
29 * Acquisition, use, and distribution of this module and related
30 * materials are subject to the restrictions of a license agreement.
31 * Consult the Preface in the User's Manual for the full terms of
32 * this agreement.
33 *
34 */
35
36#include "pepy.h"
37#include <ctype.h>
38#include <stdio.h>
39
40extern struct tuple tuples[];
41extern int rflag;
42
43char *gensym (), *modsym ();
44
45YP lookup_type (), lookup_binding ();
46YT lookup_tag ();
47char *add_point ();
48
49/* \f */
50
51do_type (yp, level, id, arg)
52register YP yp;
53register int level;
54register char *id,
55 *arg;
56{
57 register int i;
58 register char *narg;
59 char *narg2,
60 *narg3;
61 register struct tuple *t;
62 register YP y;
63 register YV yv;
64 char *class, *value, *form;
65 char tbuf1[32], tbuf2[32];
66 int pushdown = 0;
67
68 if (yp -> yp_flags & YP_COMPONENTS) {
69 warning ("I shouldn't be here!");
70 return;
71 }
72
73 if (level == 1) {
74 printf ("(pe, explicit, len, buffer, parm)\n");
75 printf ("%sPE *pe;\nint\texplicit;\n",
76 yp -> yp_code != YP_ANY
77 && yp -> yp_code != YP_NULL
78 && (yp -> yp_code != YP_CHOICE
79 || (yp -> yp_flags & YP_CONTROLLED))
80 ? "register " : "");
81 printf ("int\tlen;\nchar *buffer;\n%s parm;\n{\n",
82 yp -> yp_param_type ? yp -> yp_param_type : "PEPYPARM");
83
84 if (yp -> yp_action0) {
85 if (!Pflag && *sysin)
86 printf ("# line %d \"%s\"\n", yp -> yp_act0_lineno, sysin);
87 printf ("%*s%s\n", level * 4, "", yp -> yp_action0);
88 }
89 }
90
91 pushdown = (yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == YP_TAG;
92
93 for (t = tuples; t -> t_type != YP_UNDF; t++)
94 if (t -> t_type == yp -> yp_code) {
95 class = t -> t_class;
96 value = t -> t_id;
97 if((form = t -> t_form) == NULL)
98 form = "PE_FORM_PRIM";
99 break;
100 }
101 if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == (YP_TAG | YP_IMPLICIT)) {
102 (void) sprintf (tbuf2, "PE_CLASS_%s",
103 pe_classlist[yp -> yp_tag -> yt_class]);
104 class = tbuf2;
105 (void) sprintf (tbuf1, "%d",val2int (yp -> yp_tag -> yt_value));
106 value = tbuf1;
107 }
108
109 switch (yp -> yp_code) {
110 case YP_BOOL:
111 printf ("%*sregister int %s = %s;\n\n", level * 4, "",
112 narg = gensym (), yp -> yp_intexp ? yp -> yp_intexp
113 : level == 1 ? "len" : "0");
114 break;
115 case YP_INT:
116 case YP_INTLIST:
117 case YP_ENUMLIST:
118 printf ("%*sregister integer %s = %s;\n\n", level * 4, "",
119 narg = gensym (), yp -> yp_intexp ? yp -> yp_intexp
120 : level == 1 ? "len" : "0");
121 break;
122
123 case YP_REAL:
124 printf ("%*sregister double %s = 0.0;\n\n", level * 4, "",
125 narg = gensym ());
126 if (yp -> yp_strexp)
127 printf ("%*s%s = %s;\n", level * 4, "", narg,
128 yp -> yp_strexp);
129 break;
130
131 case YP_BIT:
132 case YP_BITLIST:
133 printf ("%*sPE\t%s_z = NULLPE;\n", level * 4, "",
134 narg = gensym ());
135 printf ("%*sregister PE *%s = &%s_z;\n\n", level * 4, "",
136 narg, narg);
137 narg = add_point (narg);
138 printf ("%*schar *%s;\n%*sint %s;\n", level * 4, "",
139 narg2 = gensym (), level * 4, "", narg3 = gensym ());
140
141 if (yp -> yp_strexp)
142 printf ("%*s%s = %s;\n%*s%s = %s;\n", level * 4, "",
143 narg2, yp -> yp_strexp, level * 4, "", narg3,
144 yp -> yp_intexp);
145 else
146 if (level == 1)
147 printf ("%*s%s = buffer;\n%*s%s = len;\n", level * 4, "",
148 narg2, level * 4, "", narg3);
149 else
150 printf ("%*s%s = NULLCP;\n%*s%s = 0;\n", level * 4, "",
151 narg2, level * 4, "", narg3);
152 printf ("%*s%s = %s ? strb2bitstr (%s, %s, %s, %s) : NULLPE;\n",
153 level * 4, "", narg, narg2, narg2, narg3, class, value);
154 break;
155
156 case YP_OCT:
157 narg = gensym ();
158 if (yp -> yp_prfexp != 'q') {
159 printf ("%*sregister char *%s;\n%*sint %s_len;\n\n",
160 level * 4, "", narg, level * 4, "", narg);
161 if (yp -> yp_strexp) {
162 printf ("%*s%s = %s;\n", level * 4, "",
163 narg, yp -> yp_strexp);
164 if (yp -> yp_intexp)
165 printf ("%*s%s_len = %s;\n", level * 4, "",
166 narg, yp -> yp_intexp);
167 else
168 printf ("%*s%s_len = strlen (%s);\n", level * 4, "",
169 narg, narg);
170 }
171 else
172 if (level == 1) {
173 printf ("%*s%s = buffer;\n", level * 4, "", narg);
174 printf ("%*sif ((%s_len = len) == 0)\n", level * 4, "",
175 narg);
176 printf ("%*s%s_len = strlen (%s);\n",
177 (level + 1) * 4, "", narg, narg);
178 }
179 else
180 printf ("%*s%s = NULLCP;\n%*s%s_len = 0;\n",
181 level * 4, "", narg, level * 4, "", narg);
182 }
183 else {
184 printf ("%*sregister struct qbuf *%s;\n\n",
185 level * 4, "", narg);
186 printf ("%*s%s = %s;\n", level * 4, "", narg, yp -> yp_strexp);
187 }
188 break;
189
190 case YP_SEQ:
191 case YP_SET:
192 case YP_ANY:
193 if (yp -> yp_strexp) {
194 printf ("%*sPE\t%s = %s;\n\n", level * 4, "",
195 narg = gensym (), yp -> yp_strexp);
196 break;
197 }
198 /* else fall */
199 case YP_NULL:
200 case YP_IDEFINED:
201 narg = NULL;
202 break;
203
204 case YP_CHOICE:
205 if (yp -> yp_type && yp -> yp_control)
206 printf ("%*sint\t%s;\n\n", level * 4, "", narg2 = gensym ());
207 narg = NULL;
208 break;
209
210 case YP_OID:
211 printf ("%*sregister OID %s;\n\n", level * 4, "",
212 narg = gensym ());
213 if (yp -> yp_strexp)
214 printf ("%*s%s = %s;\n", level * 4, "", narg, yp -> yp_strexp);
215 else if (level == 1)
216 printf ("%*s%s = buffer ? str2oid (buffer) : NULLOID;\n",
217 level * 4, "", narg);
218 else
219 printf ("%*s%s = NULLOID;\n", level * 4, "", narg);
220 break;
221
222 case YP_SEQTYPE:
223 case YP_SETTYPE:
224 printf ("%*sPE\t%s = NULLPE;\n", level * 4, "",
225 narg2 = gensym ());
226 /* and fall ... */
227 case YP_SEQLIST:
228 case YP_SETLIST:
229 printf ("%*sPE\t%s_z = NULLPE;\n", level * 4, "",
230 narg = gensym ());
231 printf ("%*sregister PE *%s = &%s_z;\n\n", level * 4, "",
232 narg, narg);
233 narg = add_point(narg);
234 break;
235
236 default:
237 myyerror ("unknown type: %d", yp -> yp_code);
238 }
239
240 switch (yp -> yp_code) {
241 case YP_SEQ:
242 case YP_SET:
243 if (yp -> yp_strexp)
244 break;
245 /* else fall */
246 case YP_SEQTYPE:
247 case YP_SETTYPE:
248 case YP_SEQLIST:
249 case YP_SETLIST:
250 case YP_NULL:
251 printf ("%*sif ((%s = pe_alloc (%s, %s, %s)) == NULLPE) {\n",
252 level * 4, "", arg, class, form, value);
253 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
254 (level + 1) * 4, "", id);
255 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
256 level * 4, "");
257 break;
258 }
259
260 if (!dflag && yp -> yp_action05)
261 do_action (yp -> yp_action05, level, narg ? narg : arg,
262 yp -> yp_act05_lineno);
263 if (!dflag && yp -> yp_action1)
264 do_action (yp -> yp_action1, level, narg ? narg : arg,
265 yp -> yp_act1_lineno);
266
267 switch (yp -> yp_code) {
268 case YP_BOOL:
269 printf ("%*sif ((%s = flag2prim (%s, %s, ",
270 level * 4, "", arg, narg, class);
271 printf ("%s)) == NULLPE) {\n", value);
272 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
273 (level + 1) * 4, "", id);
274 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
275 level * 4, "");
276 break;
277
278 case YP_INT:
279 case YP_INTLIST:
280 case YP_ENUMLIST:
281 printf ("%*sif ((%s = %snum2prim (%s, %s, ",
282 level * 4, "", arg,
283 yp->yp_code == YP_ENUMLIST ? "e" : "",
284 narg, class);
285 printf ("%s)) == NULLPE) {\n", value);
286 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
287 (level + 1) * 4, "", id);
288 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
289 level * 4, "");
290 if (yp -> yp_code == YP_INT)
291 break;
292 uniqint (yp -> yp_value);
293 printf ("%*sswitch (%s) {\n", level * 4, "", narg);
294 for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
295 printf ("%*scase %d:", (level + 1) * 4, "", val2int (yv));
296 if (yv -> yv_flags & YV_NAMED)
297 printf ("\t/* %s */", yv -> yv_named);
298 printf ("\n");
299 if (!dflag && yv -> yv_action)
300 do_action (yv -> yv_action, level + 2, narg,
301 yv -> yv_act_lineno);
302 printf ("%*sbreak;\n", (level + 2) * 4, "");
303 }
304 if (!rflag && yp -> yp_code == YP_ENUMLIST) {
305 printf ("%*sdefault:\n", (level + 1) * 4, "");
306 printf ("%*sadvise (NULLCP, \"%s %%s%%d\", PEPY_ERR_UNK_COMP, %s);\n",
307 (level + 2) * 4, "", id, narg);
308 printf ("%*sreturn NOTOK;\n", (level + 2) * 4, "");
309 }
310 printf ("%*s}\n", level * 4, "");
311 break;
312
313 case YP_REAL:
314 printf ("%*sif ((%s = real2prim (%s, %s, ",
315 level * 4, "", arg, narg, class);
316 printf ("%s)) == NULLPE) {\n", value);
317 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
318 (level + 1) * 4, "", id);
319 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
320 level * 4, "");
321 break;
322
323 case YP_BIT:
324 case YP_BITLIST:
325 printf ("%*sif (%s == NULLPE) {\n", level * 4, "", narg);
326 printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
327 (level + 1) * 4, "", id);
328 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
329 level * 4, "");
330 if (!yp -> yp_strexp && level != 1)
331 printf ("%*s%s -> pe_class = %s;\n%*s%s -> pe_id = %s;\n",
332 level * 4, "", narg, class, level * 4, "", narg, value);
333 if (yp -> yp_code == YP_BITLIST) {
334 register int j;
335
336 for (yv = yp -> yp_value, i = -1; yv; yv = yv -> yv_next)
337 if ((j = val2int (yv)) > i)
338 i = j;
339 if (i >= 0)
340 printf ("%*sif (bit_test (%s, %d) == NOTOK)\n%*s(void) bit_off (%s, %d);\n",
341 level * 4, "", narg, i,
342 (level + 1) * 4, "", narg, i);
343 }
344 printf ("%*sif ((%s = bit2prim (%s)) == NULLPE) {\n",
345 level * 4, "", arg, narg);
346 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
347 (level + 1) * 4, "", id);
348 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
349 level * 4, "");
350 if (yp -> yp_code == YP_BIT)
351 break;
352 printf ("#define\tBITS\t\"\\020");
353 for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
354 if (yv -> yv_flags & YV_NAMED)
355 printf ("\\0%o%s", val2int (yv) + 1, yv -> yv_named);
356 else
357 printf ("\\0%oBIT%d", val2int (yv) + 1, val2int (yv));
358 printf ("\"\n");
359 uniqint (yp -> yp_value);
360 if (!dflag)
361 for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
362 if (!yv -> yv_action)
363 continue;
364 printf ("%*sif (bit_test (%s, %d) > OK) {",
365 level * 4, "", narg, val2int (yv));
366 if (yv -> yv_flags & YV_NAMED)
367 printf ("\t/* %s */", yv -> yv_named);
368 printf ("\n");
369 do_action (yv -> yv_action, level + 1, narg,
370 yv -> yv_act_lineno);
371 printf ("%*s}\n", level * 4, "");
372 }
373 break;
374
375 case YP_OCT:
376 printf ("%*sif (%s == %s) {\n",
377 level * 4, "", narg,
378 yp -> yp_prfexp != 'q' ? "NULLCP" : "((struct qbuf *) 0)");
379 printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
380 (level + 1) * 4, "", id);
381 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
382 level * 4, "");
383 printf ("%*sif ((%s = ", level * 4, "", arg);
384 if (yp -> yp_prfexp != 'q')
385 printf ("str2prim (%s, %s_len,", narg, narg);
386 else
387 printf ("qb2prim (%s,", narg);
388 printf (" %s, %s)) == NULLPE) {\n", class, value);
389 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
390 (level + 1) * 4, "", id);
391 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
392 level * 4, "");
393 break;
394
395 case YP_NULL:
396 break;
397
398 case YP_ANY:
399 case YP_SEQ:
400 case YP_SET:
401 if (!yp -> yp_strexp)
402 break;
403 printf ("%*sif (%s == NULLPE) {\n", level * 4, "", narg);
404 printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
405 (level + 1) * 4, "", id);
406 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
407 level * 4, "");
408#ifdef notdef
409 printf ("%*sif ((%s = pe_cpy (%s)) == NULLPE) {\n",
410 level * 4, "", arg, narg);
411 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
412 (level + 1) * 4, "", id);
413 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
414 level * 4, "");
415#else
416 printf ("%*s(%s = %s) -> pe_refcnt++;\n",
417 level * 4, "", arg, narg);
418#endif
419 break;
420
421 case YP_OID:
422 printf ("%*sif (%s == NULLOID) {\n", level * 4, "", narg);
423 printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
424 (level + 1) * 4, "", id);
425 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
426 level * 4, "");
427 printf ("%*sif ((%s = obj2prim (%s, %s, %s)) == NULLPE) {\n",
428 level * 4, "", arg, narg, class, value);
429 printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
430 (level + 1) * 4, "", id);
431 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
432 level * 4, "");
433 break;
434
435 case YP_SEQTYPE:
436 if (yp -> yp_type && yp -> yp_control) {
437 printf ("%*sfor (%s) {\n",
438 level * 4, "", yp -> yp_control);
439 if (!dflag && yp -> yp_action3) {
440 do_action (yp -> yp_action3, ++level, narg ? narg : arg,
441 yp -> yp_act3_lineno);
442 printf ("%*s{\n", level * 4, "");
443 }
444 do_type (yp -> yp_type, level + 1, "element", narg);
445 if (!dflag && yp -> yp_action3)
446 printf ("%*s}\n", level-- * 4, "");
447#ifndef notdef
448 printf ("%*sseq_addon (%s, %s, %s);\n", (level + 1) * 4, "",
449 arg, narg2, narg);
450 printf ("%*s%s = %s;\n%*s}\n", (level + 1) * 4, "",
451 narg2, narg, level * 4, "");
452#else
453 printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
454 (level + 1) * 4, "", arg, narg);
455 printf ("%*sadvise (NULLCP, \"%s %%s: %%s\", PEPY_ERR_BAD_SEQ,\n",
456 (level + 2) * 4, "", id);
457 printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
458 "", arg);
459 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
460 (level + 1) * 4, "");
461 printf ("%*s}\n", level * 4, "");
462#endif
463 }
464 break;
465
466 case YP_SEQLIST:
467 for (y = yp -> yp_type, i = 0; y; y = y -> yp_next, i++) {
468 if (y -> yp_flags & YP_COMPONENTS)
469 do_components_seq (y, level, y -> yp_next == NULLYP,
470 id, arg, narg);
471 else {
472 do_type_element (y, level, y -> yp_next == NULLYP,
473 id, narg);
474 printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
475 printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
476 (level + 1) * 4, "", arg, narg);
477 printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SEQ,\n",
478 (level + 2) * 4, "", id);
479 printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
480 "", arg);
481 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
482 (level + 1) * 4, "");
483 }
484 }
485 for (y = yp -> yp_type; y; y = y -> yp_next) {
486 register YP z;
487
488 if (!(y -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
489 || lookup_tag (y) == NULLYT)
490 continue;
491 for (z = y -> yp_next; z; z = z -> yp_next)
492 if (!(z -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
493 || lookup_tag (z) == NULLYT)
494 break;
495 uniqtag (y, z);
496 if (z == NULLYP)
497 break;
498 y = z;
499 }
500 break;
501
502 case YP_SETTYPE:
503 if (yp -> yp_type && yp -> yp_control) {
504 printf ("%*sfor (%s) {\n",
505 level * 4, "", yp -> yp_control);
506 if (!dflag && yp -> yp_action3) {
507 do_action (yp -> yp_action3, ++level, narg ? narg : arg,
508 yp -> yp_act3_lineno);
509 printf ("%*s{\n", level * 4, "");
510 }
511 do_type (yp -> yp_type, level + 1, "member", narg);
512 if (!dflag && yp -> yp_action3)
513 printf ("%*s}\n", level-- * 4, "");
514#ifndef notdef
515 printf ("%*sset_addon (%s, %s, %s);\n", (level + 1) * 4, "",
516 arg, narg2, narg);
517 printf ("%*s%s = %s;\n%*s}\n", (level + 1) * 4, "",
518 narg2, narg, level * 4, "");
519#else
520 printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
521 (level + 1) * 4, "", arg, narg);
522 printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
523 (level + 2) * 4, "", id);
524 printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
525 "", arg);
526 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
527 (level + 1) * 4, "");
528 printf ("%*s}\n", level * 4, "");
529#endif
530 }
531 break;
532
533 case YP_SETLIST:
534 if (yp -> yp_type) {
535 for (y = yp -> yp_type; y; y = y -> yp_next) {
536 if (y -> yp_flags & YP_COMPONENTS)
537 do_components_set (y, level, id, arg, narg);
538 else {
539 do_type_member (y, level, narg);
540 printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
541 printf ("%*sif (set_add (%s, %s) == NOTOK) {\n",
542 (level + 1) * 4, "", arg, narg);
543 printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
544 (level + 2) * 4, "", id);
545 printf ("%*spe_error (%s -> pe_errno));\n",
546 (level + 4) * 4, "", arg);
547 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
548 (level + 1) * 4, "");
549 }
550 }
551 /* now pull up fully to check uniqueness */
552 choice_pullup (y = copy_type (yp), CH_FULLY);
553 uniqtag (y -> yp_type, NULLYP);
554 }
555 break;
556
557 case YP_CHOICE:
558 if (yp -> yp_type && yp -> yp_control) {
559 printf ("%*sswitch (%s = (%s)) {\n",
560 level * 4, "", narg2, yp -> yp_control);
561 for (y = yp -> yp_type, i = 0; y; y = y -> yp_next)
562 do_type_choice (y, ++i, level + 1, arg);
563 choice_pullup (yp, CH_FULLY);
564 uniqtag (yp -> yp_type, NULLYP);
565 printf ("\n%*sdefault:\n", (level + 1) * 4, "");
566 printf ("%*sadvise (NULLCP, \"%s %%s%%d\", PEPY_ERR_INVALID_CHOICE, \n",
567 (level + 2) * 4, "", id);
568 printf ("%*s%s);\n", (level + 4) * 4, "", narg2);
569 printf ("%*sreturn NOTOK;\n", (level + 2) * 4, "");
570 printf ("%*s}\n", level * 4, "");
571 if ((yp -> yp_flags & YP_TAG)
572 && !(yp -> yp_flags & YP_PULLEDUP))
573 tag_pushdown (yp, level, arg, "choice");
574 }
575 break;
576
577 case YP_IDEFINED:
578 printf ("%*sif (%s (", level * 4, "", modsym (yp -> yp_module,
579 yp -> yp_identifier, YP_ENCODER));
580 i = strlen (arg) - 3;
581 printf ("%*.*s, 0, ", i, i, arg + 2);
582 if (yp -> yp_intexp)
583 printf ("%s, ", yp -> yp_intexp);
584 else if (level == 1)
585 printf ("len, ");
586 else
587 printf ("NULL, ");
588 if (yp -> yp_strexp)
589 printf ("%s", yp -> yp_strexp);
590 else if (level == 1)
591 printf ("buffer");
592 else
593 printf ("NULLCP");
594 if (yp -> yp_flags & YP_PARMVAL)
595 printf (", %s", yp -> yp_parm);
596 else
597 printf (", NullParm");
598 printf (") == NOTOK)\n%*sreturn NOTOK;\n", (level + 1) * 4, "");
599 if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT))
600 == (YP_TAG | YP_IMPLICIT)) {
601 if (is_nonimplicit_type (yp))
602 pushdown = 1;
603 else {
604 printf ("%*s%s -> pe_class = %s;\n", level * 4, "",
605 arg, class);
606 printf ("%*s%s -> pe_id = %s;\n", level * 4, "",
607 arg, value);
608 }
609 }
610 break;
611
612 default:
613 myyerror ("unknown type: %d", yp -> yp_code);
614 }
615 if (pushdown && !(yp -> yp_flags & YP_PULLEDUP)) {
616 switch (yp -> yp_code) { /* sets & seqs are implicit implicit's? */
617 case YP_CHOICE:
618 break;
619
620 default:
621 tag_pushdown (yp, level, arg, id);
622 break;
623 }
624 }
625
626 printf ("\n#ifdef DEBUG\n%*s(void) testdebug (%s, \"",
627 level * 4, "", arg);
628 if (level == 1)
629 printf ("%s.", mymodule);
630 printf ("%s\");\n#endif\n\n", id);
631
632 if (!dflag && yp -> yp_action2)
633 do_action (yp -> yp_action2, level, arg, yp -> yp_act2_lineno);
634
635 switch (yp -> yp_code) {
636 case YP_BITLIST:
637 printf ("#undef\tBITS\n");
638 break;
639
640 default:
641 break;
642 }
643}
644
645
646static char *add_point (arg)
647char *arg;
648{
649 char buffer[BUFSIZ];
650
651 (void) sprintf (buffer, "(*%s)", arg);
652 return new_string (buffer);
653}
654
655/* \f */
656
657static do_type_member (yp, level, narg)
658register YP yp;
659register int level;
660char *narg;
661{
662 int pushdown = (yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == YP_TAG;
663 char *id = yp -> yp_flags & YP_ID ? yp -> yp_id : "member";
664
665 if (!(yp -> yp_flags & YP_TAG)) {
666 switch (yp -> yp_code) {
667 case YP_CHOICE:
668 break;
669 case YP_IDEFINED:
670 if (lookup_tag (yp) == NULLYT)
671 break;
672 /* else drop ... */
673 default:
674 tag_type (yp);
675 break;
676 }
677 }
678 printf ("%*s%s = NULLPE;\n\n", level * 4, "", narg);
679 if (yp -> yp_flags & (YP_OPTIONAL | YP_DEFAULT)) {
680 if (yp -> yp_flags & YP_OPTCONTROL)
681 printf ("%*sif (%s) {\n", level * 4, "", yp -> yp_optcontrol);
682 else
683 return;
684 }
685 else
686 printf ("%*s{\n", level * 4, "");
687
688 level++;
689 yp -> yp_flags |= YP_PULLEDUP;
690
691 do_type (yp, level, id, narg);
692
693 if (pushdown)
694 tag_pushdown (yp, level, narg, id);
695
696 level--;
697 printf ("%*s}\n", level * 4, "");
698}
699
700
701/* \f */
702
703static do_type_choice (yp, caseindex, level, narg)
704register YP yp;
705register int caseindex,
706 level;
707register char *narg;
708{
709 int pushdown = (yp -> yp_flags & YP_TAG)
710 && !(yp -> yp_flags & YP_IMPLICIT);
711 char *id = yp -> yp_flags & YP_ID ? yp -> yp_id : "member";
712
713 printf ("%*scase %d:", level * 4, "", caseindex);
714 if (yp -> yp_flags & YP_ID)
715 printf ("\t/* %s */", yp -> yp_id);
716 printf ("\n");
717 level++;
718
719 printf ("%*s{\n", level * 4, "");
720 level++;
721
722 yp -> yp_flags |= YP_PULLEDUP;
723
724 do_type (yp, level, id, narg);
725
726 if (pushdown) {
727 tag_pushdown (yp, level, narg, id);
728 }
729
730 level--;
731 printf ("%*s}\n%*sbreak;\n", level * 4, "", level * 4, "");
732}
733
734/* \f */
735
736do_action (action, level, arg, lineno)
737register char *action,
738 *arg;
739register int level;
740int lineno;
741{
742 register char c,
743 d;
744
745 printf ("%*s{\n", level * 4, "");
746
747 if (!Pflag && *sysin)
748 printf ("# line %d \"%s\"\n", lineno, sysin);
749
750 for (d = NULL; c = *action++; d = c)
751 switch (d) {
752 case '$':
753 if (c == '$') {
754 printf ("%s", arg);
755 c = NULL;
756 break;
757 }
758 putchar ('$'); /* fall */
759
760 default:
761 if (c != '$')
762 putchar (c);
763 break;
764 }
765
766 switch (d) {
767 case '\n':
768 break;
769
770 case '$':
771 putchar ('$'); /* fall */
772 default:
773 putchar ('\n');
774 break;
775 }
776
777 printf ("%*s}\n", level * 4, "");
778}
779
780/* \f */
781
782/* ARGSUSED */
783
784static do_type_element (yp, level, last, id, narg)
785register YP yp;
786register int level;
787int last;
788char *id;
789register char *narg;
790{
791 printf ("%*s%s = NULLPE;\n\n", level * 4, "", narg);
792 if (yp -> yp_flags & (YP_OPTIONAL | YP_DEFAULT)) {
793 if (yp -> yp_flags & YP_OPTCONTROL)
794 printf ("%*sif (%s) {", level * 4, "", yp -> yp_optcontrol);
795 else
796 return;
797 }
798 else {
799 printf ("%*s{", level * 4, "");
800 }
801 level++;
802 if (yp -> yp_flags & YP_ID)
803 printf ("\t/* %s */", yp -> yp_id);
804 printf ("\n");
805 do_type (yp, level, yp -> yp_flags & YP_ID ? yp -> yp_id : "element",
806 narg);
807
808 level--;
809 printf ("%*s}\n\n", level * 4, "");
810}
811
812static do_components_seq (yp, level, last, id, arg, narg)
813YP yp;
814register int level;
815register char *id,
816 *arg,
817 *narg;
818{
819 YP newyp, y;
820
821 if (yp -> yp_module) {
822 pyyerror (yp, "Can't do COMPONENTS OF with external types for %s",
823 yp -> yp_identifier);
824 return;
825 }
826
827 if (!(newyp = lookup_type (yp->yp_module, yp -> yp_identifier))) {
828 pyyerror (yp, "Can't find refernced COMPONENTS OF");
829 return;
830 }
831
832 if (newyp -> yp_code != YP_SEQLIST) {
833 yyerror_aux ("COMPONENTS OF type is not a SEQUENCE");
834 print_type (yp, 0);
835 return;
836 }
837 for (y = newyp -> yp_type; y; y = y -> yp_next) {
838 if (y -> yp_flags & YP_COMPONENTS)
839 do_components_seq (y, level, last && y -> yp_next == NULLYP,
840 id, arg, narg);
841 else {
842 do_type_element (y, level, last && y -> yp_next == NULLYP,
843 id, narg);
844 printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
845 printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
846 (level + 1) * 4, "", arg, narg);
847 printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SEQ,\n",
848 (level + 2) * 4, "", id);
849 printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
850 "", arg);
851 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
852 (level + 1) * 4, "");
853 }
854 }
855 for (y = newyp -> yp_type; y; y = y -> yp_next) {
856 register YP z;
857
858 if (!(y -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
859 || lookup_tag (y) == NULLYT)
860 continue;
861 for (z = y -> yp_next; z; z = z -> yp_next)
862 if (!(z -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
863 || lookup_tag (z) == NULLYT)
864 break;
865 uniqtag (y, z);
866 if (z == NULLYP)
867 break;
868 y = z;
869 }
870 return;
871}
872
873
874
875static do_components_set (yp, level, arg, id, narg)
876register YP yp;
877register int level;
878char *narg, *arg, *id;
879{
880
881 YP newyp, y;
882
883 if (yp -> yp_module) {
884 pyyerror (yp, "Can't do COMPONENTS OF with external types for %s",
885 yp -> yp_identifier);
886 return;
887 }
888
889 if (!(newyp = lookup_type (yp->yp_module, yp -> yp_identifier))) {
890 pyyerror (yp, "Can't find refernced COMPONENTS OF");
891 return;
892 }
893
894 if (newyp -> yp_code != YP_SETLIST) {
895 yyerror_aux ("COMPONENTS OF type is not a SET");
896 print_type (yp, 0);
897 return;
898 }
899
900 for (y = newyp -> yp_type; y; y = y -> yp_next) {
901 if (y -> yp_flags & YP_COMPONENTS)
902 do_components_set (y, level, arg, id, narg);
903 else {
904 do_type_member (y, level, narg);
905 printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
906 printf ("%*sif (set_add (%s, %s) == NOTOK) {\n",
907 (level + 1) * 4, "", arg, narg);
908 printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
909 (level + 2) * 4, "", id);
910 printf ("%*spe_error (%s -> pe_errno));\n",
911 (level + 4) * 4, "", arg);
912 printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
913 (level + 1) * 4, "");
914 }
915 }
916 choice_pullup (newyp, CH_FULLY);
917}