|
|
1.1 ! root 1: /* etabs.c */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/etabs.c,v 7.2 90/07/27 08:49:15 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/pepsy/RCS/etabs.c,v 7.2 90/07/27 08:49:15 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: etabs.c,v $ ! 12: * Revision 7.2 90/07/27 08:49:15 mrose ! 13: * update ! 14: * ! 15: * Revision 7.1 90/07/09 14:52:33 mrose ! 16: * sync ! 17: * ! 18: * Revision 7.0 90/07/01 19:54:18 mrose ! 19: * *** empty log message *** ! 20: * ! 21: */ ! 22: ! 23: /* ! 24: * NOTICE ! 25: * ! 26: * Acquisition, use, and distribution of this module and related ! 27: * materials are subject to the restrictions of a license agreement. ! 28: * Consult the Preface in the User's Manual for the full terms of ! 29: * this agreement. ! 30: * ! 31: */ ! 32: ! 33: ! 34: #include <stdio.h> ! 35: #include <ctype.h> ! 36: #include "pepsydefs.h" ! 37: #include "sym.h" ! 38: #include "pass2.h" ! 39: #include "mine.h" ! 40: ! 41: s_table *head; ! 42: ! 43: extern s_table *lookup_list(), *proc_def(); ! 44: ! 45: extern FILE *fptab; ! 46: extern char *c_tag(), *c_class(); ! 47: extern char *ec_tag(), *ec_class(); ! 48: extern char *strip_last(); ! 49: extern char *get_val(), *get_comp(), *get_string(); ! 50: extern s_table *get_offset(); ! 51: extern char *my_strcat(), *strp2name(); ! 52: extern char *my_new_str(); ! 53: extern char *mymodule; ! 54: extern char *modsym(); ! 55: extern char *concat(); ! 56: extern char *genlabel(); ! 57: extern char *notidtoid(); ! 58: extern YV calc_yv(); ! 59: extern SY syfind(); ! 60: static s_table *en_ptr; ! 61: extern s_table *ptr; ! 62: ! 63: static int cons_type = 0; ! 64: /* int explicit; */ ! 65: ! 66: s_table *save_ptr; ! 67: ! 68: #define WORDSIZE 20 ! 69: #define MAXNAME 256 /* maximum size of a identifier */ ! 70: ! 71: #ifdef DEBUG ! 72: char *str_yp_code[] = { ! 73: "Undefined", "Boolean", "Integer", "Named number list", "Bitstring", ! 74: "Named Bitstring list", "Octet String", "Null", "Sequence", ! 75: "Sequence of", "Sequence list", "Set", "Set of", "Set list", ! 76: "Choice", "Any", "Object Identifier", ! 77: "", "", "", "", "", "", "", "", ! 78: "", "", "", "", "", "", "", "Identifier", ! 79: ! 80: }; ! 81: ! 82: #endif ! 83: ! 84: /* ! 85: * table encode a type. generate tables for the encoding of a type ! 86: */ ! 87: tenc_typ(yp, id, type) ! 88: YP yp; ! 89: char *id; ! 90: char *type; ! 91: { ! 92: ! 93: char *t, *f; ! 94: char *p1; ! 95: char *s1, *s2, *s3; ! 96: char *s; ! 97: s_table *ptr1, *ptr2; ! 98: YP y; ! 99: ! 100: ! 101: if (yp->yp_code < 0 || yp->yp_code > YP_REAL) ! 102: ferrd(1, "tdec_typ: unimplemented type %d\n", yp->yp_code); ! 103: ! 104: if (yp == NULL) { ! 105: ferr(0, "tenc_typ:NULL argument\n"); ! 106: return; ! 107: } ! 108: if (yp->yp_flags & YP_DEFAULT) ! 109: gdflt(yp, G_ENC); ! 110: ! 111: if (yp->yp_flags & YP_TAG && !(yp->yp_flags & YP_IMPLICIT)) { ! 112: (void) fprintf(fptab, "\t{ ETAG, 0, "); ! 113: (void) fprintf(fptab, "%s, %s },\n", ec_tag(yp), ec_class(yp)); ! 114: } ! 115: /* Preserve the type of the containing object */ ! 116: if (type) ! 117: t = type; ! 118: else ! 119: t = my_strcat("struct ", modsym(mymodule, id, "type")); ! 120: f = yp->yp_varexp; ! 121: switch (yp->yp_code) { ! 122: ! 123: case YP_UNDF: ! 124: ferr(1, "tenc_typ:Undefined type\n"); ! 125: ! 126: case YP_BOOL: ! 127: p1 = "BOOLEAN"; ! 128: if (yp->yp_varexp) { ! 129: } else ! 130: t = NULL; ! 131: break; ! 132: ! 133: case YP_INTLIST: ! 134: ! 135: case YP_INT: ! 136: ! 137: case YP_ENUMLIST: ! 138: if (yp->yp_varexp) { ! 139: p1 = "INTEGER"; ! 140: break; ! 141: } ! 142: t = NULL; ! 143: p1 = NULL; ! 144: (void) fprintf(fptab, "\t{ SINTEGER, 0, %s, %s },\n", ! 145: c_tag(yp), c_class(yp)); ! 146: break; ! 147: ! 148: case YP_REAL: ! 149: if (yp->yp_varexp) { ! 150: p1 = "REALTYPE"; ! 151: break; ! 152: } ! 153: t = NULL; ! 154: p1 = NULL; ! 155: (void) fprintf(fptab, "\t{ SREALTYPE, 0, %s, %s },\n", ! 156: c_tag(yp), c_class(yp)); ! 157: break; ! 158: ! 159: case YP_BIT: ! 160: case YP_BITLIST: ! 161: if (yp->yp_varexp) { ! 162: p1 = "BITSTRING"; ! 163: break; ! 164: } ! 165: t = NULL; ! 166: p1 = NULL; ! 167: (void) fprintf(fptab, "\t{ SBITSTRING, 0, %s, %s },\n", ! 168: c_tag(yp), c_class(yp)); ! 169: break; ! 170: ! 171: case YP_OCT: ! 172: if (yp->yp_varexp) { ! 173: p1 = "OCTETSTRING"; ! 174: break; ! 175: } ! 176: t = NULL; ! 177: p1 = NULL; ! 178: (void) fprintf(fptab, "\t{ SOCTETSTRING, 0, %s, %s },\n", ! 179: c_tag(yp), c_class(yp)); ! 180: break; ! 181: ! 182: case YP_OID: ! 183: if (yp->yp_varexp) { ! 184: p1 = "OBJID"; ! 185: break; ! 186: } ! 187: t = NULL; ! 188: p1 = NULL; ! 189: (void) fprintf(fptab, "\t{ SOBJID, 0, %s, %s },\n", ! 190: c_tag(yp), c_class(yp)); ! 191: break; ! 192: ! 193: ! 194: case YP_SEQ: ! 195: case YP_SET: ! 196: case YP_ANY: ! 197: if (yp->yp_varexp) { ! 198: p1 = "ANY"; ! 199: break; ! 200: } ! 201: t = NULL; ! 202: p1 = NULL; ! 203: (void) fprintf(fptab, "\t{ SANY, 0, %s, %s },\n", ! 204: c_tag(yp), c_class(yp)); ! 205: break; ! 206: ! 207: case YP_NULL: ! 208: p1 = "T_NULL"; ! 209: t = NULL; ! 210: break; ! 211: ! 212: case YP_IDEFINED: ! 213: p1 = NULL; ! 214: { ! 215: /* Predefined Universal Type */ ! 216: struct univ_typ *p, *univtyp(); ! 217: ! 218: if ((p = univtyp(yp->yp_identifier))) { ! 219: if (p->univ_flags & UNF_EXTMOD) { ! 220: yp->yp_module = p->univ_mod; ! 221: goto do_obj; ! 222: } ! 223: if (f == NULL) {/* No offset type */ ! 224: if (yp->yp_flags & YP_TAG ! 225: && yp->yp_flags & YP_IMPLICIT) ! 226: (void) fprintf(fptab, "\t{ S%s, 0, %d, %s },\n", ! 227: p->univ_tab, ! 228: yp->yp_tag->yt_value->yv_number, ! 229: c_flags(yp, yp->yp_tag->yt_class)); ! 230: else ! 231: (void) fprintf(fptab, "\t{ S%s, 0, %d, %s },\n", ! 232: p->univ_tab, p->univ_id, ! 233: c_flags(yp, p->univ_class)); ! 234: break; ! 235: } ! 236: if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) ! 237: (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %d, %s },\n", ! 238: p->univ_tab, t, f, ! 239: yp->yp_tag->yt_value->yv_number, ! 240: c_flags(yp, yp->yp_tag->yt_class)); ! 241: else ! 242: (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %d, %s },\n", ! 243: p->univ_tab, t, f, p->univ_id, ! 244: c_flags(yp, p->univ_class)); ! 245: break; ! 246: } ! 247: } ! 248: do_obj: ! 249: if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) ! 250: (void) fprintf(fptab, "\t{ IMP_OBJ, 0, %s, %s },\n", c_tag(yp), c_class(yp)); ! 251: if (yp->yp_parm) { ! 252: ferr(1, "tenc_typ:YP_IDEFINED:yp_parm found\n"); ! 253: } ! 254: if (yp->yp_module == NULL ! 255: || strcmp(yp->yp_module, mymodule) == 0) { ! 256: if (f == NULL) { /* No offset type */ ! 257: (void) fprintf(fptab, "\t{ SOBJECT, 0, _Z%s, %s },\n", ! 258: proc_name(yp->yp_identifier, 0), c_class(yp)); ! 259: } else ! 260: (void) fprintf(fptab, ! 261: "\t{ OBJECT, OFFSET(%s, %s), _Z%s, %s },\n", ! 262: t, f, proc_name(yp->yp_identifier, 0), c_class(yp)); ! 263: } else { ! 264: if (f == NULL) { /* No offset type */ ! 265: (void) fprintf(fptab, "\t{ SEXTOBJ, 0, _Z%s, %s },\n", ! 266: strp2name(yp->yp_identifier, yp->yp_module), ! 267: c_class(yp)); ! 268: } else ! 269: (void) fprintf(fptab, ! 270: "\t{ EXTOBJ, OFFSET(%s, %s), _Z%s, %s },\n", ! 271: t, f, strp2name(yp->yp_identifier, yp->yp_module), ! 272: c_class(yp)); ! 273: ! 274: (void) fprintf(fptab, "\t{ EXTMOD, %d, 0, 0 },\n", ! 275: gen_modref(yp->yp_module)); ! 276: } ! 277: break; ! 278: ! 279: case YP_SEQLIST: ! 280: p1 = NULL; ! 281: /* support for -h flag */ ! 282: #if 0 ! 283: if (hflag && (y = yp->yp_type) && !y->yp_next) { ! 284: tenc_typ(y, id, yp->yp_structname); ! 285: break; ! 286: } ! 287: #endif ! 288: cons_type++; ! 289: save_ptr = en_ptr; ! 290: if (yp->yp_varexp == NULL && type != NULL) ! 291: ferr(1, "tenc_typ:YP_SEQLIST:NULL varexp pointer\n"); ! 292: if (type != NULL) ! 293: (void) fprintf(fptab, "\t{ SEQ_START, OFFSET(%s, %s), %s, %s },\n", ! 294: t, f, c_tag(yp), c_class(yp)); ! 295: else ! 296: (void) fprintf(fptab, "\t{ SEQ_START, 0, %s, %s },\n", ! 297: c_tag(yp), c_class(yp)); ! 298: if (y = yp->yp_type) { ! 299: if (type) { ! 300: if (yp->yp_declexp == NULL) ! 301: ferr(1, "tenc_typ:YP_SEQLIST:no declexp\n"); ! 302: yp->yp_structname = my_strcat("struct ", yp->yp_declexp); ! 303: } else ! 304: yp->yp_structname = t; ! 305: if (optfield(y)) { ! 306: (void) fprintf(fptab, ! 307: "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n", ! 308: yp->yp_structname); ! 309: } ! 310: tenc_loop(y, id, yp->yp_structname); ! 311: } ! 312: (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n"); ! 313: en_ptr = save_ptr; ! 314: cons_type--; ! 315: break; ! 316: ! 317: case YP_SETLIST: ! 318: p1 = NULL; ! 319: /* support for -h flag */ ! 320: #if 0 ! 321: if (hflag && (y = yp->yp_type) && !y->yp_next) { ! 322: tenc_typ(y, id, yp->yp_structname); ! 323: break; ! 324: } ! 325: #endif ! 326: cons_type++; ! 327: if (yp->yp_varexp == NULL && type != NULL) ! 328: ferr(1, "tenc_typ:YP_SETLIST:NULL varexp pointer\n"); ! 329: if (type != NULL) ! 330: (void) fprintf(fptab, "\t{ SET_START, OFFSET(%s, %s), %s, %s },\n", ! 331: t, f, c_tag(yp), c_class(yp)); ! 332: else ! 333: (void) fprintf(fptab, "\t{ SET_START, 0, %s, %s },\n", ! 334: c_tag(yp), c_class(yp)); ! 335: if (y = yp->yp_type) { ! 336: if (type) { ! 337: if (yp->yp_declexp == NULL) ! 338: ferr(1, "tenc_typ:YP_SETLIST:no declexp\n"); ! 339: yp->yp_structname = my_strcat("struct ", yp->yp_declexp); ! 340: } else ! 341: yp->yp_structname = t; ! 342: if (optfield(y)) { ! 343: (void) fprintf(fptab, ! 344: "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n", ! 345: yp->yp_structname); ! 346: } ! 347: tenc_loop(y, id, yp->yp_structname); ! 348: } ! 349: (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n"); ! 350: en_ptr = save_ptr; ! 351: cons_type--; ! 352: break; ! 353: ! 354: case YP_SEQTYPE: ! 355: p1 = NULL; ! 356: cons_type++; ! 357: save_ptr = en_ptr; ! 358: if (type != NULL) ! 359: (void) fprintf(fptab, "\t{ SEQOF_START, OFFSET(%s, %s), %s, %s },\n", ! 360: t, f, c_tag(yp), c_class(yp)); ! 361: else ! 362: (void) fprintf(fptab, "\t{ SEQOF_START, 0, %s, %s },\n", ! 363: c_tag(yp), c_class(yp)); ! 364: if (y = yp->yp_type) { ! 365: if (type) { ! 366: if (yp->yp_declexp == NULL) ! 367: ferr(1, "tenc_typ:YP_SEQTYPE:no declexp\n"); ! 368: yp->yp_structname = my_strcat("struct ", yp->yp_declexp); ! 369: } else ! 370: yp->yp_structname = t; ! 371: tenc_loop(y, id, yp->yp_structname); ! 372: } ! 373: if (yp->yp_structname != NULL) ! 374: (void) fprintf(fptab, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n", ! 375: yp->yp_structname); ! 376: else ! 377: (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n"); ! 378: en_ptr = save_ptr; ! 379: cons_type--; ! 380: break; ! 381: ! 382: case YP_SETTYPE: ! 383: p1 = NULL; ! 384: cons_type++; ! 385: save_ptr = en_ptr; ! 386: if (type != NULL) ! 387: (void) fprintf(fptab, "\t{ SETOF_START, OFFSET(%s, %s), %s, %s },\n", ! 388: t, f, c_tag(yp), c_class(yp)); ! 389: else ! 390: (void) fprintf(fptab, "\t{ SETOF_START, 0, %s, %s },\n", ! 391: c_tag(yp), c_class(yp)); ! 392: ! 393: if (y = yp->yp_type) { ! 394: if (type) { ! 395: if (yp->yp_declexp == NULL) ! 396: ferr(1, "tenc_typ:YP_SETTYPE:no declexp\n"); ! 397: yp->yp_structname = my_strcat("struct ", yp->yp_declexp); ! 398: } else ! 399: yp->yp_structname = t; ! 400: tenc_loop(y, id, yp->yp_structname); ! 401: } ! 402: if (yp->yp_structname != NULL) ! 403: (void) fprintf(fptab, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n", ! 404: yp->yp_structname); ! 405: else ! 406: (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n"); ! 407: en_ptr = save_ptr; ! 408: cons_type--; ! 409: break; ! 410: ! 411: case YP_CHOICE: ! 412: p1 = NULL; ! 413: /* support for -h flag */ ! 414: if (hflag && (y = yp->yp_type) && !y->yp_next) { ! 415: tenc_typ(y, id, yp->yp_structname); ! 416: break; ! 417: } ! 418: cons_type++; ! 419: save_ptr = en_ptr; ! 420: if (type != NULL) ! 421: (void) fprintf(fptab, "\t{ CHOICE_START, OFFSET(%s, %s), 0, %s },\n", ! 422: t, f, c_class(yp)); ! 423: else ! 424: (void) fprintf(fptab, "\t{ CHOICE_START, 0, 0, 0 },\n"); ! 425: if (y = yp->yp_type) { ! 426: if (type) { ! 427: if (yp->yp_declexp == NULL) ! 428: ferr(1, "tenc_typ:YP_CHOICE:no declexp\n"); ! 429: yp->yp_structname = my_strcat("struct ", yp->yp_declexp); ! 430: } else ! 431: yp->yp_structname = t; ! 432: (void) fprintf(fptab, "\t{ SCTRL, OFFSET(%s, offset), 0, 0 },\n", ! 433: yp->yp_structname); ! 434: tenc_loop(y, id, yp->yp_structname); ! 435: } ! 436: (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n"); ! 437: en_ptr = save_ptr; ! 438: cons_type--; ! 439: break; ! 440: ! 441: default: ! 442: ferrd(1, "tenc_typ: yp_code = %d not implemented\n", yp->yp_code); ! 443: } ! 444: ! 445: if (p1 != NULL) ! 446: if (t != NULL) ! 447: (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %s, %s },\n", ! 448: p1, t, f, c_tag(yp), c_class(yp)); ! 449: else ! 450: (void) fprintf(fptab, "\t{ %s, 0, %s, %s },\n", ! 451: p1, c_tag(yp), c_class(yp)); ! 452: } ! 453: ! 454: static int fflags[] = { ! 455: 0, 1, 2, 2, 3, 3, 4, 5, 16, 16, 16, 17, 17, 17, ! 456: 0, -1, 6, 0, 10, 9}; ! 457: ! 458: /* ! 459: * calculate the tag string of the given type and return it ! 460: */ ! 461: char * ! 462: c_tag(yp) ! 463: YP yp; ! 464: { ! 465: static char buf[WORDSIZE]; ! 466: int i; ! 467: ! 468: if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) { ! 469: i = yp->yp_tag->yt_value->yv_number; ! 470: } else { ! 471: if (yp->yp_code < 0 || yp->yp_code > YP_REAL ! 472: || yp->yp_code == YP_CHOICE) ! 473: i = 0; ! 474: else ! 475: i = fflags[yp->yp_code]; ! 476: /* Choice now legal argument - to allow prte_* routines to work */ ! 477: if (i == 0 && yp->yp_code != YP_CHOICE) ! 478: ferrd (1, "c_tag:Unknown Tag %d", yp->yp_code); ! 479: } ! 480: ! 481: (void) sprintf(buf, "%d", i); ! 482: ! 483: return (buf); ! 484: } ! 485: ! 486: /* ! 487: * calculate the tag string of the explicit tag and return it ! 488: */ ! 489: char * ! 490: ec_tag(yp) ! 491: YP yp; ! 492: { ! 493: static char buf[WORDSIZE]; ! 494: int i; ! 495: ! 496: if (!(yp->yp_flags & YP_TAG) || yp->yp_flags & YP_IMPLICIT) ! 497: ferr(1, "ec_tag:internal error:called with out explicit tag\n"); ! 498: ! 499: i = yp->yp_tag->yt_value->yv_number; ! 500: ! 501: (void) sprintf(buf, "%d", i); ! 502: ! 503: return (buf); ! 504: } ! 505: ! 506: /* ! 507: * produce a string that represents the class/flags field for a given ! 508: * yp entry taking the class to be that given in cl ! 509: */ ! 510: char * ! 511: c_flags(yp, cl) ! 512: YP yp; ! 513: int cl; ! 514: { ! 515: char *p1; ! 516: static char buf[STRSIZE]; ! 517: ! 518: switch (yp->yp_code) { ! 519: case YP_IDEFINED: ! 520: case YP_CHOICE: ! 521: if (yp->yp_flags & YP_TAG) ! 522: break; ! 523: if (yp->yp_flags & YP_OPTIONAL) { ! 524: p1 = "FL_OPTIONAL"; ! 525: } else if (yp->yp_flags & YP_DEFAULT) { ! 526: p1 = "FL_DEFAULT"; ! 527: } else ! 528: p1 = "0"; ! 529: return (p1); ! 530: ! 531: default: ! 532: break; ! 533: } ! 534: switch (cl) { ! 535: case PE_CLASS_UNIV: ! 536: p1 = "FL_UNIVERSAL"; ! 537: break; ! 538: ! 539: case PE_CLASS_APPL: ! 540: p1 = "FL_APPLICATION"; ! 541: break; ! 542: ! 543: case PE_CLASS_PRIV: ! 544: p1 = "FL_PRIVATE"; ! 545: break; ! 546: ! 547: case PE_CLASS_CONT: ! 548: p1 = "FL_CONTEXT"; ! 549: break; ! 550: ! 551: default: ! 552: ferrd(1, "c_flags: illegal class found %d\n", cl); ! 553: ! 554: } ! 555: if (yp->yp_flags & YP_OPTIONAL) { ! 556: strncpy(buf, p1, STRSIZE); ! 557: p1 = strncat(buf, "|FL_OPTIONAL", STRSIZE); ! 558: } else if (yp->yp_flags & YP_DEFAULT) { ! 559: strncpy(buf, p1, STRSIZE); ! 560: p1 = strncat(buf, "|FL_DEFAULT", STRSIZE); ! 561: } ! 562: return (p1); ! 563: } ! 564: /* ! 565: * calculate a string specifying the class for the given type and ! 566: * return it ! 567: */ ! 568: char * ! 569: c_class(yp) ! 570: YP yp; ! 571: { ! 572: int i; ! 573: ! 574: if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) { ! 575: i = yp->yp_tag->yt_class; ! 576: } else { ! 577: i = PE_CLASS_UNIV; ! 578: } ! 579: return (c_flags(yp, i)); ! 580: ! 581: } ! 582: /* ! 583: * calculate a string specifying the class for the explicit tag and ! 584: * return it ! 585: */ ! 586: char * ! 587: ec_class(yp) ! 588: YP yp; ! 589: { ! 590: int i; ! 591: char *p1; ! 592: static char buf[STRSIZE]; ! 593: ! 594: if (!(yp->yp_flags & YP_TAG) || yp->yp_flags & YP_IMPLICIT) ! 595: ferr(1, "ec_class:internal error:called with out explicit tag\n"); ! 596: switch (yp->yp_code) { ! 597: case YP_IDEFINED: ! 598: case YP_CHOICE: ! 599: if (yp->yp_flags & YP_TAG) ! 600: break; ! 601: if (yp->yp_flags & YP_OPTIONAL) { ! 602: p1 = "FL_OPTIONAL"; ! 603: } else if (yp->yp_flags & YP_DEFAULT) { ! 604: p1 = "FL_DEFAULT"; ! 605: } else ! 606: p1 = "0"; ! 607: return (p1); ! 608: ! 609: default: ! 610: break; ! 611: } ! 612: ! 613: i = yp->yp_tag->yt_class; ! 614: ! 615: switch (i) { ! 616: case PE_CLASS_UNIV: ! 617: p1 = "FL_UNIVERSAL"; ! 618: break; ! 619: ! 620: case PE_CLASS_APPL: ! 621: p1 = "FL_APPLICATION"; ! 622: break; ! 623: ! 624: case PE_CLASS_PRIV: ! 625: p1 = "FL_PRIVATE"; ! 626: break; ! 627: ! 628: case PE_CLASS_CONT: ! 629: p1 = "FL_CONTEXT"; ! 630: break; ! 631: ! 632: default: ! 633: ferrd(1, "c_class: illegal class found %d\n", i); ! 634: ! 635: } ! 636: if (yp->yp_flags & YP_OPTIONAL) { ! 637: strncpy(buf, p1, STRSIZE); ! 638: p1 = strncat(buf, "|FL_OPTIONAL", STRSIZE); ! 639: } else if (yp->yp_flags & YP_DEFAULT) { ! 640: strncpy(buf, p1, STRSIZE); ! 641: p1 = strncat(buf, "|FL_DEFAULT", STRSIZE); ! 642: } ! 643: return (p1); ! 644: } ! 645: ! 646: /* ! 647: * generate tables for encoding a contructed type ! 648: */ ! 649: tenc_loop(yp, id, type) ! 650: YP yp; ! 651: char *id; ! 652: char *type; ! 653: { ! 654: for (; yp != NULL; yp = yp->yp_next) { ! 655: tenc_typ(yp, id, type); ! 656: } ! 657: } ! 658: ! 659: /* ! 660: * Print the string and exit if argument greater than zero ! 661: */ ! 662: ferr(i, s) ! 663: int i; ! 664: char *s; ! 665: { ! 666: (void) fprintf(stderr, "%s", s); ! 667: if (i > 0) ! 668: exit(i); ! 669: } ! 670: ! 671: /* ! 672: * Print the integer and exit if argument greater than zero ! 673: */ ! 674: ferrd(i, s, d) ! 675: int i; ! 676: char *s; ! 677: int d; ! 678: { ! 679: (void) fprintf(stderr, s, d); ! 680: if (i > 0) ! 681: exit(i); ! 682: } ! 683: ! 684: /* ! 685: * Print the string and exit if argument greater than zero ! 686: */ ! 687: ferrs(i, s, d) ! 688: int i; ! 689: char *s; ! 690: char *d; ! 691: { ! 692: (void) fprintf(stderr, s, d); ! 693: if (i > 0) ! 694: exit(i); ! 695: } ! 696: ! 697: /* ! 698: * return a copy of the string s minus its last character ! 699: */ ! 700: char * ! 701: strip_last(s) ! 702: char *s; ! 703: { ! 704: char *t, *r; ! 705: ! 706: if (s) { ! 707: t = new_string(s); ! 708: for (r = t; *r != '\0'; r++); ! 709: ; ! 710: *--r = '\0'; ! 711: return t; ! 712: } else ! 713: return NULL; ! 714: } ! 715: ! 716: /* ! 717: * add the declaration specified by the strings type and id to the ! 718: * start of the declaration list ! 719: */ ! 720: add_list(type, id) ! 721: char *type, *id; ! 722: { ! 723: ! 724: s_table *prev; ! 725: ! 726: if ((prev = (s_table *) malloc(sizeof(s_table))) == NULL) ! 727: ferr(1, "add_list: Out of memory\n"); ! 728: prev->type = type; ! 729: prev->name = id; ! 730: prev->parent = NULL; ! 731: prev->defined = 0; ! 732: prev->next = head; ! 733: head = prev; ! 734: } ! 735: ! 736: #if 0 ! 737: /* ! 738: * return the element in the declaration list whose name field is id ! 739: */ ! 740: s_table * ! 741: lookup_list(id) ! 742: char *id; ! 743: { ! 744: s_table *prev; ! 745: ! 746: for (prev = head; prev != NULL; prev = prev->next) ! 747: if (!strcmp(prev->name, id)) ! 748: return prev; ! 749: return (NULL); ! 750: /* ferrs(1, "lookup_list: the id %s is not present\n",id); */ ! 751: } ! 752: #endif ! 753: ! 754: /* ! 755: * print the declaration list ! 756: */ ! 757: print_list() ! 758: { ! 759: s_table *prev; ! 760: ! 761: for (prev = head; prev != NULL; prev = prev->next) { ! 762: (void) printf("type is %s\n", prev->type); ! 763: (void) printf("name is %s\n", prev->name); ! 764: (void) printf("\n"); ! 765: } ! 766: } ! 767: ! 768: /* ! 769: * parse the declaration in the string s returning the type in v1 and ! 770: * the name in v2 ! 771: */ ! 772: parse_decl(s, v1, v2) ! 773: char **s, **v1, **v2; ! 774: { ! 775: char *t; ! 776: ! 777: for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_'); t++); ! 778: ! 779: *s = t; ! 780: if (*t != '\0') { ! 781: for (; *t != '*'; t++); ! 782: *t = '\0'; ! 783: *v1 = my_strcat(*s, "*"); ! 784: Printf(3, ("the type is %s\n", *v1)); ! 785: if (*++t == '*') ! 786: t++; ! 787: for (*s = t; isalnum(*t) || *t == '_'; t++); ! 788: if (*t != '\0') { ! 789: *t = '\0'; ! 790: t++; ! 791: } ! 792: *v2 = new_string(*s); /* don't really need new_string */ ! 793: Printf(2, ("the name is %s\n", *v2)); ! 794: *s = t; ! 795: } ! 796: } ! 797: ! 798: /* ! 799: * return the next identifier in the string s ! 800: */ ! 801: char * ! 802: get_val(s) ! 803: char **s; ! 804: { ! 805: char *t, *r; ! 806: ! 807: for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_' || *t == '.'); t++); ! 808: ! 809: if (*t != '\0') { ! 810: for (*s = t; isalnum(*t) || *t == '_' || *t == '.'; t++); ! 811: *t = '\0'; ! 812: r = *s; ! 813: Printf(3, ("arg is |%s|\n", r)); ! 814: *s = ++t; ! 815: return r; ! 816: } else ! 817: return NULL; ! 818: } ! 819: ! 820: #if 0 ! 821: /* ! 822: * add the definition contained in s to the start of the declaration ! 823: * list ! 824: */ ! 825: s_table * ! 826: proc_def(s) ! 827: char *s; ! 828: { ! 829: char *s1, *s2, *s3; ! 830: s_table *ptr1, *ptr2; ! 831: ! 832: s1 = get_val(&s); ! 833: ptr1 = lookup_list(s1); ! 834: if (!ptr1->defined) { ! 835: s2 = get_val(&s); ! 836: ptr2 = lookup_list(s2); ! 837: ptr1->parent = ptr2; ! 838: s3 = get_val(&s); ! 839: ptr1->field = s3; ! 840: ptr1->defined++; ! 841: } ! 842: return ptr1; ! 843: } ! 844: #endif ! 845: ! 846: /* ! 847: * return the next component (sequence of characters up to the next ! 848: * ';' or '\0') of the string s ! 849: */ ! 850: char * ! 851: get_comp(s) ! 852: char **s; ! 853: { ! 854: char *t, *r; ! 855: ! 856: for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_' || *t == ';'); t++); ! 857: ! 858: if (*t != '\0') { ! 859: for (*s = t; *t != '\0' && *t != ';'; t++); ! 860: *t = '\0'; ! 861: r = *s; ! 862: Printf(3, ("component is |%s|\n", r)); ! 863: *s = ++t; ! 864: return r; ! 865: } else ! 866: return NULL; ! 867: } ! 868: ! 869: #if 0 ! 870: /* ! 871: * work out what the offset for the type yp should be and return a ! 872: * pointer to the element in the declaration list which can be used ! 873: * to calculate the offset ! 874: */ ! 875: s_table * ! 876: get_offset(yp, level) ! 877: YP yp; ! 878: int level; ! 879: { ! 880: char *s, *s1; ! 881: s_table *ptr1; ! 882: ! 883: switch (yp->yp_code) { ! 884: ! 885: case YP_UNDF: ! 886: ferr(1, "get_offset: Undefined type\n"); ! 887: break; ! 888: ! 889: case YP_BOOL: ! 890: case YP_INT: ! 891: case YP_INTLIST: ! 892: case YP_NULL: ! 893: if (yp->yp_varexp) { ! 894: s = new_string(yp->yp_intexp); ! 895: s1 = get_val(&s); ! 896: ptr1 = lookup_list(s1); ! 897: return ptr1; ! 898: } else { ! 899: ferr(0, "get_offset: No intexp\n"); ! 900: return NULL; ! 901: } ! 902: break; ! 903: ! 904: case YP_BIT: ! 905: case YP_BITLIST: ! 906: if (yp->yp_direction & YP_DECODER) ! 907: if (yp->yp_action2) { ! 908: s = new_string(yp->yp_action2); ! 909: s1 = get_val(&s); ! 910: if (strcmp(s1, "if")) ! 911: ferrs(1, "get_offset: What to do, action2 = %s\n", yp->yp_action2); ! 912: else { ! 913: s1 = get_val(&s); ! 914: ptr1 = lookup_list(s1); ! 915: return ptr1; ! 916: } ! 917: } else ! 918: return NULL; ! 919: else if (yp->yp_varexp) { ! 920: s = new_string(yp->yp_varexp); ! 921: s1 = get_val(&s); ! 922: s1 = get_val(&s); ! 923: ptr1 = lookup_list(s1); ! 924: return ptr1; ! 925: } else { ! 926: ferr(0, "get_offset: No strexp (BIT)\n"); ! 927: return NULL; ! 928: } ! 929: break; ! 930: case YP_OCT: ! 931: case YP_OID: ! 932: case YP_SEQ: ! 933: case YP_SET: ! 934: case YP_ANY: ! 935: if (yp->yp_varexp) { ! 936: s = new_string(yp->yp_varexp); ! 937: s1 = get_val(&s); ! 938: ptr1 = lookup_list(s1); ! 939: return ptr1; ! 940: } else { ! 941: ferr(0, "get_offset: No strexp\n"); ! 942: return NULL; ! 943: } ! 944: break; ! 945: ! 946: case YP_IDEFINED: ! 947: if (yp->yp_parm) { ! 948: s = new_string(yp->yp_parm); ! 949: s1 = get_val(&s); ! 950: ptr1 = lookup_list(s1); ! 951: return ptr1; ! 952: } else { ! 953: ferr(0, "get_offset: No parm\n"); ! 954: return NULL; ! 955: } ! 956: break; ! 957: ! 958: case YP_SEQLIST: ! 959: case YP_SETLIST: ! 960: case YP_CHOICE: ! 961: if (yp->yp_action1) { ! 962: s = get_string(yp->yp_action1, yp->yp_direction); ! 963: while ((s1 = get_comp(&s)) != NULL) ! 964: (void) proc_def(s1); ! 965: } ! 966: if (yp->yp_type == NULL) { ! 967: if (level > 0) ! 968: ferr(0, "get_offset: There exists an embeded empty SEQUENCE/SET/CHOICE\n"); ! 969: return (yp->yp_direction & YP_ENCODER ? en_ptr : ptr); ! 970: } ! 971: if ((ptr1 = get_offset(yp->yp_type, level + 1)) != NULL) ! 972: if (ptr1->parent != NULL && level > 0) ! 973: return ptr1->parent; ! 974: else ! 975: return ptr1; ! 976: else { ! 977: ferr(0, "get_offset: returning NULL (SEQLIST/SETLIST/CHOICE)\n"); ! 978: return NULL; ! 979: } ! 980: break; ! 981: ! 982: case YP_SEQTYPE: ! 983: case YP_SETTYPE: ! 984: if (yp->yp_action3) { ! 985: s = get_string(yp->yp_action3, yp->yp_direction); ! 986: while ((s1 = get_comp(&s)) != NULL) ! 987: (void) proc_def(s1); ! 988: } ! 989: if ((ptr1 = get_offset(yp->yp_type, level + 1)) != NULL) ! 990: if (ptr1->parent != NULL && level > 0) ! 991: return ptr1->parent; ! 992: else ! 993: return ptr1; ! 994: else { ! 995: ferr(0, "get_offset: returning NULL (SEQTYPE/SETTYPE)\n"); ! 996: return NULL; ! 997: } ! 998: break; ! 999: ! 1000: default: ! 1001: ferrd(1, "get_offset: yp_code = %d not implemented\n", yp->yp_code); ! 1002: return NULL; ! 1003: break; ! 1004: } ! 1005: } ! 1006: #endif ! 1007: ! 1008: /* ! 1009: * return a copy of that part of the string s which may contain ! 1010: * definitions for the variables generated by posy ! 1011: */ ! 1012: char * ! 1013: get_string(s, direction) ! 1014: char *s; ! 1015: int direction; ! 1016: { ! 1017: char *t, *t1; ! 1018: ! 1019: if (direction & YP_ENCODER) ! 1020: return new_string(s); ! 1021: if (direction & YP_DECODER) { ! 1022: t = new_string(s); ! 1023: for (t1 = t; !(isalnum(*t1) || *t1 == '_'); t1++); ! 1024: if (*t1 == 'i' && *++t1 == 'f' && *++t1 == ' ') { /* MALLOC code */ ! 1025: for (; *t1 != '}'; t1++) /* skip MALLOC code */ ! 1026: ; ! 1027: t1++; ! 1028: Printf(4, ("returning the string %s\n", t1)); ! 1029: return t1; ! 1030: } else ! 1031: return t; ! 1032: } ! 1033: } ! 1034: ! 1035: #if 0 ! 1036: c_type(yp) ! 1037: YP yp; ! 1038: { ! 1039: switch (yp->yp_code) { ! 1040: ! 1041: case YP_IDEFINED: ! 1042: return T_OBJ; ! 1043: break; ! 1044: ! 1045: ! 1046: default: ! 1047: return T_PRIM; ! 1048: break; ! 1049: } ! 1050: } ! 1051: ! 1052: #endif ! 1053: /* ! 1054: * Determine wether this list contains any items that will generate ! 1055: * an optional field. If so return non zero ! 1056: */ ! 1057: optfield(yp) ! 1058: YP yp; ! 1059: { ! 1060: for (; yp; yp = yp->yp_next) { ! 1061: if (yp->yp_flags & YP_OPTIONAL) ! 1062: switch (yp->yp_code) { ! 1063: case YP_BOOL: ! 1064: case YP_INT: ! 1065: case YP_INTLIST: ! 1066: case YP_ENUMLIST: ! 1067: case YP_NULL: ! 1068: return (1); ! 1069: } ! 1070: } ! 1071: return (0); ! 1072: } ! 1073: ! 1074: gen_dflts(yp, type) ! 1075: YP yp; ! 1076: char *type; ! 1077: { ! 1078: YP y; ! 1079: ! 1080: if (yp == NULL) ! 1081: return; ! 1082: switch (yp->yp_code) { ! 1083: case YP_IDEFINED: ! 1084: #if 0 ! 1085: if (yp->yp_module == NULL ! 1086: || strcmp(yp->yp_module, mymodule) == 0) ! 1087: break; ! 1088: if (lookup_list(yp->yp_module)) ! 1089: break; /* already done */ ! 1090: /* Got an external reference */ ! 1091: (void) fprintf(fptab, "#include \"%s%s\"\n", yp->yp_module, HFILE2); ! 1092: add_list("module", yp->yp_module); ! 1093: #endif ! 1094: break; ! 1095: ! 1096: case YP_CHOICE: ! 1097: case YP_SEQTYPE: ! 1098: case YP_SETTYPE: ! 1099: case YP_SEQLIST: ! 1100: case YP_SETLIST: ! 1101: for (y = yp->yp_type; y != NULL; y = y->yp_next) { ! 1102: gen_dflts(y, type); ! 1103: } ! 1104: break; ! 1105: ! 1106: default: ! 1107: break; ! 1108: } ! 1109: /* Output definitions for default entries */ ! 1110: if (yp->yp_flags & YP_DEFAULT) ! 1111: defdflt(yp, type); ! 1112: } ! 1113: /* ! 1114: * Compute the concatenation into a temporary buffer of two strings ! 1115: * after having run notid on them first ! 1116: */ ! 1117: char * ! 1118: strp2name(s1, s2) ! 1119: char *s1, *s2; ! 1120: { ! 1121: char *p; ! 1122: static char buf[STRSIZE * 2 + 5]; ! 1123: ! 1124: if (strlen(s1) > STRSIZE || strlen(s2) > STRSIZE) ! 1125: ferr(1, "strp2name:string to big\n"); ! 1126: strcpy(buf, p = notidtoid(s1)); ! 1127: free(p); ! 1128: strcat(buf, p = notidtoid(s2)); ! 1129: free(p); ! 1130: ! 1131: return (buf); ! 1132: } ! 1133: ! 1134: /* ! 1135: * Output the definitions for default entries and initialise the yp's ! 1136: * to have pointers which reference these definitions for use by ! 1137: * gdflt routine. ! 1138: */ ! 1139: defdflt(yp, name) ! 1140: YP yp; ! 1141: char *name; ! 1142: { ! 1143: YV yv; ! 1144: YV yv1; ! 1145: SY sy; ! 1146: YP yp1; ! 1147: int size, i; ! 1148: char *str; ! 1149: char *label; ! 1150: struct univ_typ *p; ! 1151: int code; ! 1152: ! 1153: if ((yp->yp_flags & YP_DEFAULT) == 0) ! 1154: ferrd(1, "defdflt:called with out a default code = %d\n", yp->yp_code); ! 1155: yv = yp->yp_default; ! 1156: ! 1157: yp1 = yp; ! 1158: ! 1159: /* Find the bottom definition */ ! 1160: code = yp1->yp_code; ! 1161: while (code == YP_IDEFINED) { ! 1162: if ((sy = syfind(yp1->yp_identifier)) == NULL) { ! 1163: if ((p = univtyp(yp1->yp_identifier)) == NULL ! 1164: || p->univ_type <= YP_UNDF) ! 1165: ferrs(1, ! 1166: "defdflt:IDEFINED:cannot find definition of symbol %s\n", ! 1167: yp1->yp_identifier); ! 1168: code = p->univ_type; ! 1169: break; ! 1170: ! 1171: } ! 1172: yp1 = sy->sy_type; ! 1173: code = yp1->yp_code; ! 1174: } ! 1175: ! 1176: switch (code) { ! 1177: case YP_BOOL: ! 1178: case YP_INT: ! 1179: case YP_INTLIST: ! 1180: case YP_ENUMLIST: ! 1181: switch (yv->yv_code) { ! 1182: case YV_NUMBER: ! 1183: case YV_BOOL: ! 1184: /* None needed */ ! 1185: break; ! 1186: ! 1187: case YV_IDEFINED: ! 1188: if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { ! 1189: ferrs(1, "defdflt:BOOL/INT:cannot find definition of %s\n", ! 1190: yv->yv_identifier); ! 1191: } ! 1192: /* None Needed */ ! 1193: break; ! 1194: ! 1195: default: ! 1196: ferrd(1, "defdflt:INT/BOOL:unimplemented value code = %d\n", ! 1197: yv->yv_code); ! 1198: } ! 1199: break; ! 1200: ! 1201: case YP_REAL: ! 1202: switch (yv->yv_code) { ! 1203: case YV_REAL: ! 1204: yv1 = yv; ! 1205: goto dumpdef3; ! 1206: ! 1207: case YV_IDEFINED: ! 1208: if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { ! 1209: ferrs(1, "defdflt:REAL:cannot find definition of %s\n", ! 1210: yv->yv_identifier); ! 1211: } ! 1212: goto dumpdef3; ! 1213: break; ! 1214: ! 1215: default: ! 1216: ferrd(1, "defdflt:REAL:unimplemented value code = %d\n", ! 1217: yv->yv_code); ! 1218: } ! 1219: break; ! 1220: ! 1221: case YP_BIT: ! 1222: case YP_BITLIST: ! 1223: switch (yv->yv_code) { ! 1224: /* ! 1225: * This is an illegal value for a bit string ! - BUT ACSE ! 1226: * uses it ! ! 1227: */ ! 1228: /* gdflt also patched to support it */ ! 1229: case YV_IDEFINED: ! 1230: ferrs(0, ! 1231: "warning:bitstring default specified illegally with identifier %s\n", ! 1232: yv->yv_identifier); ! 1233: if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { ! 1234: ferrs(1, "defdflt:BIT:cannot find definition of %s\n", ! 1235: yv->yv_identifier); ! 1236: } ! 1237: /* doesn't work fix posy-yacc.y */ ! 1238: size = numtobstr(yv1, &str); ! 1239: goto dumpdef1; ! 1240: ! 1241: case YV_NUMBER: ! 1242: /* doesn't work fix posy-yacc.y */ ! 1243: size = numtobstr(yv, &str); ! 1244: goto dumpdef1; ! 1245: ! 1246: case YV_VALIST: ! 1247: if ((size = valisttobs(yp1, yv, &str)) < 0) { ! 1248: ferrs(1, "defdflt:bad default value for bistring %s\n", ! 1249: yp->yp_flags & YP_ID ? yp->yp_identifier : ""); ! 1250: } ! 1251: goto dumpdef1; ! 1252: ! 1253: default: ! 1254: /* Could be a syntax error */ ! 1255: ferrd(1, "defdflt:BIT:illegal value code = %d\n", yv->yv_code); ! 1256: } ! 1257: break; ! 1258: ! 1259: case YP_IDEFINED: ! 1260: ferrs(1, "defdflt:IDEFINED:internal error on symbol %s\n", ! 1261: yp1->yp_identifier); ! 1262: break; ! 1263: ! 1264: case YP_OCT: ! 1265: switch (yv->yv_code) { ! 1266: case YV_NUMBER: ! 1267: /* doesn't work fix posy-yacc.y */ ! 1268: size = numtobstr(yv, &str); ! 1269: goto dumpdef2; ! 1270: ! 1271: case YV_STRING: ! 1272: str = yv->yv_string; ! 1273: size = strlen(str); ! 1274: goto dumpdef2; ! 1275: ! 1276: default: ! 1277: /* Could be a syntax error */ ! 1278: ferrd(1, "defdflt:OCT:illegal value code = %d\n", yv->yv_code); ! 1279: } ! 1280: break; ! 1281: ! 1282: case YP_NULL: ! 1283: case YP_SEQ: ! 1284: case YP_SEQTYPE: ! 1285: case YP_SEQLIST: ! 1286: case YP_SET: ! 1287: case YP_SETTYPE: ! 1288: case YP_SETLIST: ! 1289: case YP_CHOICE: ! 1290: case YP_ANY: ! 1291: case YP_OID: ! 1292: /* None yet */ ! 1293: break; ! 1294: ! 1295: default: ! 1296: ferrd(1, "defdflt:unknown type %d\n", code); ! 1297: } ! 1298: ! 1299: return; ! 1300: ! 1301: dumpdef1: /* Bitstrings */ ! 1302: label = genlabel(name, yp); ! 1303: yp->yp_action0 = label; ! 1304: yp->yp_act0_lineno = size; ! 1305: i = (size + NBPC - 1) / NBPC; ! 1306: (void) fprintf(fptab, "\nstatic char %s[] = ", label); ! 1307: if (printable(str, i)) ! 1308: prstr(fptab, str, i); ! 1309: else ! 1310: prhstr(fptab, str, i); ! 1311: (void) fprintf(fptab, ";\n"); ! 1312: return; ! 1313: ! 1314: dumpdef2: /* Octet strings (and aliases) */ ! 1315: label = genlabel(name, yp); ! 1316: yp->yp_action0 = label; ! 1317: yp->yp_act0_lineno = size; ! 1318: (void) fprintf(fptab, "\nstatic char %s[] = ", label); ! 1319: if (printable(str, size)) ! 1320: prstr(fptab, str, size); ! 1321: else ! 1322: prhstr(fptab, str, size); ! 1323: (void) fprintf(fptab, ";\n"); ! 1324: return; ! 1325: ! 1326: dumpdef3: /* Reals */ ! 1327: label = genlabel(name, yp); ! 1328: yp->yp_action0 = label; ! 1329: (void) fprintf(fptab, "\nstatic double %s = %f;\n", label, yv1->yv_real); ! 1330: return; ! 1331: ! 1332: } ! 1333: /* ! 1334: * generate the default entry for encoding/decoding fields. This ! 1335: * should contain the default value which the encoder will know means ! 1336: * default encoding ! 1337: */ ! 1338: gdflt(yp, which) ! 1339: YP yp; ! 1340: int which; /* Which type of entries to generate ! 1341: * G_ENC encode G_DEC decode */ ! 1342: { ! 1343: YV yv; ! 1344: YV yv1; ! 1345: SY sy; ! 1346: YP yp1; ! 1347: int size; ! 1348: char *str; ! 1349: ! 1350: char *ndflt; ! 1351: struct univ_typ *p; ! 1352: int code; ! 1353: ! 1354: ! 1355: if (which == G_ENC) ! 1356: ndflt = "DFLT_F"; ! 1357: else ! 1358: ndflt = "DFLT_B"; ! 1359: ! 1360: if ((yp->yp_flags & YP_DEFAULT) == 0) ! 1361: ferrd(1, "gdflt:called with out a default code = %d\n", yp->yp_code); ! 1362: yv = yp->yp_default; ! 1363: ! 1364: yp1 = yp; ! 1365: ! 1366: /* Find the bottom definition */ ! 1367: code = yp1->yp_code; ! 1368: while (code == YP_IDEFINED) { ! 1369: if ((sy = syfind(yp1->yp_identifier)) == NULL) { ! 1370: if ((p = univtyp(yp1->yp_identifier)) == NULL ! 1371: || p->univ_type <= YP_UNDF) ! 1372: ferrs(1, ! 1373: "gdflt:IDEFINED:cannot find definition of symbol %s\n", ! 1374: yp1->yp_identifier); ! 1375: code = p->univ_type; ! 1376: break; ! 1377: ! 1378: } ! 1379: yp1 = sy->sy_type; ! 1380: code = yp1->yp_code; ! 1381: } ! 1382: ! 1383: switch (code) { ! 1384: case YP_BOOL: ! 1385: case YP_INT: ! 1386: case YP_INTLIST: ! 1387: case YP_ENUMLIST: ! 1388: switch (yv->yv_code) { ! 1389: case YV_NUMBER: ! 1390: case YV_BOOL: ! 1391: (void) fprintf(fptab, "\t{ %s, %d, 0, 0 },\n", ndflt, ! 1392: yp->yp_default->yv_number); ! 1393: break; ! 1394: ! 1395: case YV_IDEFINED: ! 1396: if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { ! 1397: ferrs(1, "gdflt:BOOL/INT:cannot find definition of %s\n", ! 1398: yv->yv_identifier); ! 1399: } ! 1400: (void) fprintf(fptab, "\t{ %s, %d, 0, 0 },\n", ndflt, ! 1401: yv1->yv_number); ! 1402: break; ! 1403: ! 1404: default: ! 1405: ferrd(1, "gdflt:INT/BOOL:unimplemented value code = %d\n", ! 1406: yv->yv_code); ! 1407: } ! 1408: break; ! 1409: ! 1410: case YP_BIT: ! 1411: case YP_BITLIST: ! 1412: switch (yv->yv_code) { ! 1413: #ifdef ILLEGAL_DEFAULTS ! 1414: case YV_IDEFINED: /* supporting illegal default ! 1415: * specification */ ! 1416: #endif ! 1417: case YV_NUMBER: ! 1418: case YV_VALIST: ! 1419: (void) fprintf(fptab, "\t{ %s, %d, %d, 0 },\n", ndflt, ! 1420: yp->yp_act0_lineno, addptr(yp->yp_action0)); ! 1421: break; ! 1422: ! 1423: default: ! 1424: /* Could be a syntax error */ ! 1425: ferrd(1, "gdflt:BIT:illegal value code = %d\n", yv->yv_code); ! 1426: } ! 1427: break; ! 1428: ! 1429: case YP_IDEFINED: ! 1430: ferrs(1, "gdflt:IDEFINED:internal error on symbol %s\n", ! 1431: yp1->yp_identifier); ! 1432: break; ! 1433: ! 1434: case YP_REAL: ! 1435: switch (yv->yv_code) { ! 1436: #ifdef ILLEGAL_DEFAULTS ! 1437: case YV_IDEFINED: /* Illegal according to ASN.1 but we can do it ! 1438: * so why not support it ! 1439: */ ! 1440: #endif ! 1441: case YV_REAL: ! 1442: (void) fprintf(fptab, "\t{ %s, 0, %d, 0 },\n", ndflt, ! 1443: addptr(concat("&", yp->yp_action0))); ! 1444: break; ! 1445: ! 1446: default: ! 1447: /* Could be a syntax error */ ! 1448: ferrd(1, "gdflt:REAL:illegal value code = %d\n", yv->yv_code); ! 1449: } ! 1450: break; ! 1451: ! 1452: case YP_OCT: ! 1453: switch (yv->yv_code) { ! 1454: case YV_NUMBER: ! 1455: case YV_STRING: ! 1456: (void) fprintf(fptab, "\t{ %s, %d, %d, 0 },\n", ndflt, ! 1457: yp->yp_act0_lineno, addptr(yp->yp_action0)); ! 1458: break; ! 1459: ! 1460: default: ! 1461: /* Could be a syntax error */ ! 1462: ferrd(1, "gdflt:OCT:illegal value code = %d\n", yv->yv_code); ! 1463: } ! 1464: break; ! 1465: ! 1466: case YP_NULL: ! 1467: case YP_SEQ: ! 1468: case YP_SEQTYPE: ! 1469: case YP_SEQLIST: ! 1470: case YP_SET: ! 1471: case YP_SETTYPE: ! 1472: case YP_SETLIST: ! 1473: case YP_CHOICE: ! 1474: case YP_ANY: ! 1475: case YP_OID: ! 1476: (void) fprintf(fptab, "\t{ %s, 0, 0, 0 },\n", ndflt); ! 1477: break; ! 1478: ! 1479: default: ! 1480: ferrd(1, "gdflt:unknown type %d\n", yp->yp_code); ! 1481: } ! 1482: ! 1483: } ! 1484: /* ! 1485: * Calculate the value associated with the given identifier id by ! 1486: * looking at the value definitions associated with type definition ! 1487: * yp. Returns the value definition if found or NULL if not. ! 1488: */ ! 1489: YV ! 1490: calc_yv(yp, id) ! 1491: YP yp; ! 1492: char *id; ! 1493: { ! 1494: YV yv; ! 1495: ! 1496: for (yv = yp->yp_value; yv != NULL; yv = yv->yv_next) { ! 1497: if (yv->yv_flags & YV_NAMED && strcmp(yv->yv_named, id) == 0) ! 1498: return (yv); ! 1499: } ! 1500: ! 1501: return (NULL); ! 1502: } ! 1503: ! 1504: /* ! 1505: * ******* This does not work. posy needs to be fixed for case of ! 1506: * '01'b ***** Turn a Literal number value in yv into a bistring ! 1507: * initialisation. Return the length of the bit string or less than ! 1508: * zero on error. Set the (char *) pointer, whose address is in ! 1509: * ppstr, to point to a string containing the a reference to a ! 1510: * character array which contains the bits. ! 1511: */ ! 1512: ! 1513: numtobstr(yv, ppstr) ! 1514: YV yv; ! 1515: char **ppstr; ! 1516: { ! 1517: ! 1518: int ibits, lastb, i; ! 1519: char *buf; ! 1520: ! 1521: buf = malloc(NBPI / NBPC + 1); ! 1522: bzero(buf, NBPI / NBPC + 1); ! 1523: lastb = -1; ! 1524: ibits = yv->yv_number; ! 1525: for (i = 0; i < NBPI; i++) { ! 1526: if ((1 << i) & ibits) { ! 1527: buf[i / NBPC] |= 1 << (NBPC - 1 - (i % NBPC)); ! 1528: lastb = i; ! 1529: } ! 1530: } ! 1531: ! 1532: *ppstr = buf; ! 1533: return (lastb + 1); ! 1534: } ! 1535: #define ROUNDUP 10 ! 1536: /* ! 1537: * Take a list of Values (YV_VALIST) which should contain a list of ! 1538: * bits and convert them into a bitstring initialisation. As in ! 1539: * numtobstr return the size of the bit string or a negative number ! 1540: * if there is an error. Put a reference to a character array which ! 1541: * contains the definition of the bits in the character pointer whose ! 1542: * address is in ppstr. yp is the definition of the type which ! 1543: * contains the names of all the defined bits. ! 1544: */ ! 1545: valisttobs(yp, yv, ppstr) ! 1546: YP yp; ! 1547: YV yv; ! 1548: char **ppstr; ! 1549: { ! 1550: ! 1551: YV yv1, yv2; ! 1552: int lastb, val, nsize, size; ! 1553: char *buf; ! 1554: ! 1555: lastb = -1; ! 1556: size = ROUNDUP; ! 1557: if ((buf = malloc(size)) == NULL) { ! 1558: ferrd(1, "valisttobs:malloc:failed on %d\n", size); ! 1559: } ! 1560: bzero(buf, size); ! 1561: for (yv1 = yv->yv_idlist; yv1 != NULL; yv1 = yv1->yv_next) { ! 1562: if ((yv2 = calc_yv(yp, yv1->yv_identifier)) == NULL) { ! 1563: return (-1); ! 1564: } ! 1565: val = yv2->yv_number; ! 1566: /* Bug here probably */ ! 1567: if (size < val / NBPC) { ! 1568: nsize = val / NBPC + ROUNDUP; ! 1569: if ((buf = realloc(buf, nsize)) == NULL) { ! 1570: ferrd(1, "valisttobs:realloc:failed on %d\n", nsize); ! 1571: } ! 1572: bzero(buf + size, nsize - size); ! 1573: size = nsize; ! 1574: } ! 1575: buf[val / NBPC] |= 1 << (NBPC - 1 - (val % NBPC)); ! 1576: if (val > lastb) ! 1577: lastb = val; ! 1578: } ! 1579: *ppstr = buf; ! 1580: return (lastb + 1); ! 1581: } ! 1582: /* ! 1583: * Print the string out in a format acceptable as a quoted string in ! 1584: * a C program including the quotes. Using \ escapes for unprintable ! 1585: * characters ! 1586: */ ! 1587: prstr(fp, str, len) ! 1588: FILE *fp; ! 1589: char *str; ! 1590: int len; ! 1591: { ! 1592: (void) fputc('"', fp); ! 1593: while (len-- > 0) { ! 1594: if (isprint(*str & 0xff)) { ! 1595: (void) fputc(*str & 0xff, fptab); ! 1596: str++; ! 1597: continue; ! 1598: } ! 1599: (void) fprintf(fptab, "\\%0o", *str); ! 1600: } ! 1601: (void) fputc('"', fp); ! 1602: #define MAXPLINE 16 ! 1603: } ! 1604: /* ! 1605: * output a initialisation for a character array as unsigned hex ! 1606: * numbers ! 1607: */ ! 1608: prhstr(fptab, str, len) ! 1609: FILE *fptab; ! 1610: char *str; ! 1611: int len; ! 1612: { ! 1613: int npline; /* number on this line */ ! 1614: ! 1615: (void) fprintf(fptab, "{\n"); ! 1616: npline = 0; ! 1617: while (len > 0) { ! 1618: if (npline >= MAXPLINE) { ! 1619: (void) fputc('\n', fptab); ! 1620: npline = 0; ! 1621: } ! 1622: npline++; ! 1623: (void) fprintf(fptab, " 0x%02x,", *str++ & 0xff); ! 1624: len--; ! 1625: } ! 1626: (void) fprintf(fptab, "}"); ! 1627: } ! 1628: /* ! 1629: * determine if the string is printable i.e. only sensible to be read ! 1630: * as a character string. 1 (true) if it is 0, if it isn't ! 1631: */ ! 1632: printable(str, i) ! 1633: char *str; ! 1634: int i; ! 1635: { ! 1636: while (i-- > 0) { ! 1637: if (!isprint(*str & 0xff)) ! 1638: return (0); /* look for the first non printable ! 1639: * character */ ! 1640: } ! 1641: return (1); ! 1642: } ! 1643: /* ! 1644: * generate a unique identifier using the name given and the name if ! 1645: * present in yp. Return a pointer to it in a space malloc'ed out ! 1646: */ ! 1647: char * ! 1648: genlabel(name, yp) ! 1649: char *name; ! 1650: YP yp; ! 1651: { ! 1652: char buf[MAXNAME]; ! 1653: static int cnt; ! 1654: char *p1, *p2; ! 1655: ! 1656: p1 = notidtoid(name); ! 1657: if (yp->yp_flags & YP_ID) { ! 1658: p2 = notidtoid(yp->yp_id); ! 1659: (void) sprintf(buf, "L%s_%s_%d", p1, p2, cnt++); ! 1660: free(p2); ! 1661: } else ! 1662: (void) sprintf(buf, "L%s_X_%d", p1, cnt++); ! 1663: free(p1); ! 1664: ! 1665: return (my_new_str(buf)); ! 1666: } ! 1667: /* ! 1668: * generate a ptr table reference for the given module table entry ! 1669: */ ! 1670: gen_modref(mod) ! 1671: char *mod; ! 1672: { ! 1673: char buf[BUFSIZ]; ! 1674: char *p1; ! 1675: int ind; ! 1676: ! 1677: p1 = notidtoid(mod); ! 1678: (void) sprintf(buf, "&%s%s%s", PREFIX, p1, MODTYP_SUFFIX); ! 1679: ind = addptr(buf); ! 1680: free(p1); ! 1681: ! 1682: return (ind); ! 1683: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.