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