|
|
1.1 ! root 1: /* pass2.c */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/pass2.c,v 7.2 90/07/27 08:49:22 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/pepsy/RCS/pass2.c,v 7.2 90/07/27 08:49:22 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: pass2.c,v $ ! 12: * Revision 7.2 90/07/27 08:49:22 mrose ! 13: * update ! 14: * ! 15: * Revision 7.1 90/07/01 20:00:32 mrose ! 16: * update ! 17: * ! 18: */ ! 19: ! 20: /* ! 21: * NOTICE ! 22: * ! 23: * Acquisition, use, and distribution of this module and related ! 24: * materials are subject to the restrictions of a license agreement. ! 25: * Consult the Preface in the User's Manual for the full terms of ! 26: * this agreement. ! 27: * ! 28: */ ! 29: ! 30: ! 31: #include <stdio.h> ! 32: #include <ctype.h> ! 33: #include "pepsydefs.h" ! 34: #include "pass2.h" ! 35: #include "mine.h" ! 36: #include "sym.h" ! 37: ! 38: extern int doexternals; ! 39: extern int sflag; ! 40: ! 41: #if 0 ! 42: extern int hflag; ! 43: extern int bwidth; ! 44: ! 45: #endif ! 46: extern char *eval; ! 47: ! 48: #if 0 ! 49: extern char *yyprefix; ! 50: ! 51: #endif ! 52: extern int Aflag; ! 53: extern SY mysymbols; ! 54: extern char *modsym(); ! 55: extern char *my_strcat(); ! 56: extern char *notidtoid(); ! 57: ! 58: FILE *fptab, *ffopen(); ! 59: ! 60: peri_pass2() ! 61: { ! 62: ! 63: int nentries; ! 64: int encflag = 1, decflag = 1, prntflag = 1; ! 65: char *buf, *inc, *tab, *act; ! 66: SY sy; ! 67: YP yp; ! 68: FILE *fph, *fphh, *fpe, *fpd, *fpp; ! 69: FILE *fpa; ! 70: ! 71: if (!sflag) ! 72: (void) fflush(stderr); ! 73: ! 74: if (bflag) { ! 75: register int i, j; ! 76: ! 77: i = 2, j = 10; ! 78: for (sy = mysymbols; sy; sy = sy->sy_next) ! 79: if (!(sy->sy_type->yp_flags & YP_IMPORTED)) ! 80: if (++i >= j) ! 81: j *= 10; ! 82: } ! 83: if (strcmp(mymodule, "UNIV")) ! 84: (void) lookup_module("UNIV", NULLOID); ! 85: ! 86: fph = ffopen(my_strcat(mymodule, HFILE1)); ! 87: inc = my_strcat (mymodule, HFILE2); ! 88: (void) fprintf (fph, "#ifndef\tPEPYPATH\n"); ! 89: (void) fprintf (fph, "#include <isode/pepsy/%s>\n", inc); ! 90: (void) fprintf (fph, "#else\n"); ! 91: (void) fprintf (fph, "#include \"%s\"\n", inc); ! 92: (void) fprintf (fph, "#endif\n\n\n"); ! 93: ! 94: #ifdef ACT_CODE ! 95: act = my_strcat(mymodule, ACTIONDEFS); ! 96: ! 97: fpe = ffopen(my_strcat(mymodule, ENCFILENAME)); ! 98: file_header(fpe, act); ! 99: fpd = ffopen(my_strcat(mymodule, DECFILENAME)); ! 100: file_header(fpd, act); ! 101: fpp = ffopen(my_strcat(mymodule, PRNTFILENAME)); ! 102: file_header(fpp, act); ! 103: fpa = ffopen(act); ! 104: #endif ! 105: tab = notidtoid(mymodule); ! 106: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 107: eval = sy->sy_name; ! 108: yp = sy->sy_type; ! 109: ! 110: if (sy->sy_module == NULLCP) ! 111: yyerror("no module name associated with symbol"); ! 112: if (yp->yp_flags & YP_IMPORTED) ! 113: continue; ! 114: if (strcmp(sy->sy_module, mymodule)) { ! 115: fprintf(stderr, "mymodule unsuitable for module name e.g %s and %s(mymodule)\n", sy->sy_module, mymodule); ! 116: exit(1); ! 117: } ! 118: if (yp->yp_direction & YP_ENCODER || Aflag) { ! 119: buf = modsym (sy -> sy_module, sy -> sy_name, yyencdflt); ! 120: fprintf(fph, "#define %s", buf); ! 121: fprintf(fph, "(pe, top, len, buffer, parm) \\\n"); ! 122: fprintf(fph, " %s(%s%s, ", ENCFNCNAME, PREFIX, proc_name(sy->sy_name, 1)); ! 123: fprintf(fph, "&%s%s%s, ", PREFIX, tab, MODTYP_SUFFIX); ! 124: fprintf(fph, "pe, top, len, buffer, (char *) parm)\n\n"); ! 125: #ifdef ACT_CODE ! 126: if (encflag) { ! 127: fprintf(fpe, "%s%s", ENC_FNCNAME, tab); ! 128: open_func(fpe); ! 129: encflag--; ! 130: } ! 131: #endif ! 132: if (bflag) ! 133: init_new_file(); ! 134: if (bflag) ! 135: end_file(); ! 136: } ! 137: if (yp->yp_direction & YP_DECODER || Aflag) { ! 138: buf = modsym (sy -> sy_module, sy -> sy_name, yydecdflt); ! 139: if (bflag) ! 140: init_new_file(); ! 141: fprintf(fph, "#define %s", buf); ! 142: fprintf(fph, "(pe, top, len, buffer, parm) \\\n"); ! 143: fprintf(fph, " %s(%s%s, ", DECFNCNAME, PREFIX, proc_name(sy->sy_name, 1)); ! 144: fprintf(fph, "&%s%s%s, ", PREFIX, tab, MODTYP_SUFFIX); ! 145: fprintf(fph, "pe, top, len, buffer, (char **) parm)\n\n"); ! 146: #if ACT_CODE ! 147: if (decflag) { ! 148: fprintf(fpd, "%s%s", DEC_FNCNAME, tab); ! 149: open_func(fpd); ! 150: decflag--; ! 151: } ! 152: #endif ! 153: if (bflag) ! 154: end_file(); ! 155: } ! 156: if (yp->yp_direction & YP_PRINTER || Aflag) { ! 157: buf = modsym (sy -> sy_module, sy -> sy_name, yyprfdflt); ! 158: if (bflag) ! 159: init_new_file(); ! 160: fprintf(fph, "#define %s", buf); ! 161: fprintf(fph, "(pe, top, len, buffer, parm) \\\n"); ! 162: fprintf(fph, " %s(%s%s, ", PRNTFNCNAME, PREFIX, proc_name(sy->sy_name, 1)); ! 163: fprintf(fph, "&%s%s%s, ", PREFIX, tab, MODTYP_SUFFIX); ! 164: #if 0 ! 165: /* no parm arguement to prnt_f now */ ! 166: fprintf(fph, "pe, top, len, buffer, (char *) parm)\n"); ! 167: #endif ! 168: fprintf(fph, "pe, top, len, buffer)\n"); ! 169: fprintf(fph, "#define %s_P", buf); ! 170: fprintf(fph, " %s%s, ", PREFIX, ! 171: proc_name(sy->sy_name, 1)); ! 172: fprintf(fph, "&%s%s%s\n\n", PREFIX, tab, MODTYP_SUFFIX); ! 173: #ifdef ACT_CODE ! 174: if (prntflag) { ! 175: fprintf(fpp, "%s%s", PRNT_FNCNAME, tab); ! 176: open_func(fpp); ! 177: prntflag--; ! 178: } ! 179: #endif ! 180: if (bflag) ! 181: end_file(); ! 182: } ! 183: if (!bflag && ferror(stdout)) ! 184: myyerror("write error - %s", sys_errname(errno)); ! 185: } ! 186: ! 187: #ifdef ACT_CODE ! 188: if (!encflag) { ! 189: close_func(fpe); ! 190: } ! 191: if (!decflag) { ! 192: close_func(fpd); ! 193: } ! 194: if (!prntflag) { ! 195: close_func(fpp); ! 196: } ! 197: #endif ! 198: ! 199: close(fph); ! 200: #ifdef ACT_CODE ! 201: close(fpe); ! 202: close(fpd); ! 203: close(fpp); ! 204: close(fpa); ! 205: #endif ! 206: ! 207: fptab = ffopen(my_strcat(mymodule, TBLNAME)); ! 208: ! 209: /* Only need two files <stdio.h> and our types file which includes ! 210: * everything else we need ! 211: * Assumption. types file in the same directory as the _tables ! 212: */ ! 213: fprintf(fptab, "#include <stdio.h>\n"); ! 214: fprintf(fptab, "#include \"%s%s\"\n\n", mymodule, GENTYPES); ! 215: ! 216: ! 217: #if 0 ! 218: { ! 219: #define NFILES 5 ! 220: char *files[NFILES]; ! 221: char buf[BUFSIZ]; ! 222: int last = 0; /* next free slot in files */ ! 223: ! 224: strncpy(buf, mymodule, BUFSIZ); ! 225: strncat(buf, GENTYPES, BUFSIZ); ! 226: ! 227: files[last++] = buf; ! 228: files[last++] = inc; ! 229: files[last++] = (char *)0; ! 230: ! 231: fprintf(fptab, "#include <stdio.h>\n"); ! 232: doincl(fptab, files); ! 233: ! 234: #undef NFILES ! 235: } ! 236: ! 237: /* already done in our types.h file */ ! 238: proc_extmod(fptab); /* process the external modules here as well */ ! 239: #endif ! 240: ! 241: #if 0 ! 242: fprintf(fptab, "#include \"%s%s\"\n", mymodule, GENTYPES); ! 243: fprintf(fptab, "#include \"%s\"\n", inc); ! 244: #endif ! 245: #ifdef ACT_CODE ! 246: fprintf(fptab, "#include \"%s\"\n", act); ! 247: #endif ! 248: /* ! 249: * loop through and generate all the default values definitions ! 250: */ ! 251: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 252: yp = sy->sy_type; ! 253: if (yp->yp_flags & YP_IMPORTED) ! 254: continue; ! 255: if (yp->yp_direction & (YP_ENCODER | YP_DECODER | YP_PRINTER) ! 256: || Aflag) { ! 257: gen_dflts(sy->sy_type, sy->sy_name); ! 258: } ! 259: } ! 260: fprintf(fptab, "\n#define OFFSET(t,f)\t((int ) &(((t *)0)->f))\n\n"); ! 261: nentries = 0; ! 262: head = NULL; ! 263: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 264: yp = sy->sy_type; ! 265: if (yp->yp_flags & YP_IMPORTED) ! 266: continue; ! 267: if (yp->yp_direction & YP_ENCODER || Aflag) { ! 268: nentries++; ! 269: gen_enctbl(sy); ! 270: } ! 271: } ! 272: head = NULL; ! 273: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 274: yp = sy->sy_type; ! 275: if (yp->yp_flags & YP_IMPORTED) ! 276: continue; ! 277: if (yp->yp_direction & YP_DECODER || Aflag) ! 278: gen_dectbl(sy); ! 279: } ! 280: ! 281: head = NULL; ! 282: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 283: yp = sy->sy_type; ! 284: if (yp->yp_flags & YP_IMPORTED) ! 285: continue; ! 286: if (yp->yp_direction & YP_PRINTER || Aflag) ! 287: gen_prnttbl(sy); ! 288: } ! 289: ! 290: fphh = ffopen(inc); ! 291: fprintf(fphh, "\nextern modtyp %s%s%s;\n", ! 292: PREFIX, tab, MODTYP_SUFFIX); ! 293: out_final_defs(fphh); ! 294: close(fphh); ! 295: ! 296: gen_tpe(); ! 297: gen_modtype(tab, nentries, encflag, decflag, prntflag); ! 298: ! 299: #if 0 ! 300: write_ph_file(); ! 301: print_list(); ! 302: #endif ! 303: ! 304: gen_lint(fptab); ! 305: ! 306: fclose(fptab); ! 307: } ! 308: ! 309: gen_enctbl(sy) ! 310: SY sy; ! 311: { ! 312: fprintf(fptab, "static tpe %s%s[] = {\n", ETABLE, proc_name(sy->sy_name, 0)); ! 313: fprintf(fptab, "\t{ PE_START, 0, 0, 0 },\n"); ! 314: gen_enctbl_rest(sy->sy_type, sy->sy_name); ! 315: fprintf(fptab, "\t{ PE_END, 0, 0, 0 }\n"); ! 316: fprintf(fptab, "\t};\n"); ! 317: fprintf(fptab, "\n"); ! 318: } ! 319: ! 320: gen_dectbl(sy) ! 321: SY sy; ! 322: { ! 323: fprintf(fptab, "static tpe %s%s[] = {\n", DTABLE, proc_name(sy->sy_name, 0)); ! 324: fprintf(fptab, "\t{ PE_START, 0, 0, 0 },\n"); ! 325: gen_dectbl_rest(sy->sy_type, sy->sy_name); ! 326: fprintf(fptab, "\t{ PE_END, 0, 0, 0 }\n"); ! 327: fprintf(fptab, "\t};\n"); ! 328: fprintf(fptab, "\n"); ! 329: } ! 330: ! 331: ! 332: gen_prnttbl(sy) ! 333: SY sy; ! 334: { ! 335: fprintf(fptab, "static ptpe %s%s[] = {\n", PTABLE, proc_name(sy->sy_name, 0)); ! 336: fprintf(fptab, "\t{ PE_START, 0, 0, 0, \"%s\" },\n", sy->sy_name); ! 337: gen_prnttbl_rest(sy->sy_type, sy->sy_name); ! 338: fprintf(fptab, "\t{ PE_END, 0, 0, 0, NULL }\n"); ! 339: fprintf(fptab, "\t};\n"); ! 340: fprintf(fptab, "\n"); ! 341: } ! 342: ! 343: ! 344: gen_enctbl_rest(yp, id) ! 345: YP yp; ! 346: char *id; ! 347: { ! 348: int i; ! 349: ! 350: i = tenc_typ(yp, id, NULL); ! 351: } ! 352: ! 353: gen_dectbl_rest(yp, id) ! 354: YP yp; ! 355: char *id; ! 356: { ! 357: int i; ! 358: ! 359: i = tdec_typ(yp, id, NULL); ! 360: } ! 361: ! 362: gen_prnttbl_rest(yp, id) ! 363: YP yp; ! 364: char *id; ! 365: { ! 366: int i; ! 367: ! 368: i = tprnt_typ(yp, id, NULL); ! 369: } ! 370: ! 371: ! 372: /* ! 373: * define the tpe index tables and the pointer table ! 374: */ ! 375: gen_tpe() ! 376: { ! 377: SY sy; ! 378: ! 379: fprintf(fptab, "static tpe *etabl[] = {\n"); ! 380: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 381: if (sy->sy_type->yp_flags & YP_IMPORTED) ! 382: continue; ! 383: if (sy->sy_type->yp_direction & YP_ENCODER || Aflag) ! 384: fprintf(fptab, "\t%s%s,\n", ETABLE, proc_name(sy->sy_name, 0)); ! 385: } ! 386: fprintf(fptab, "\t};\n\n"); ! 387: ! 388: fprintf(fptab, "static tpe *dtabl[] = {\n"); ! 389: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 390: if (sy->sy_type->yp_flags & YP_IMPORTED) ! 391: continue; ! 392: if (sy->sy_type->yp_direction & YP_DECODER || Aflag) ! 393: fprintf(fptab, "\t%s%s,\n", DTABLE, proc_name(sy->sy_name, 0)); ! 394: } ! 395: fprintf(fptab, "\t};\n\n"); ! 396: ! 397: fprintf(fptab, "static ptpe *ptabl[] = {\n"); ! 398: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 399: if (sy->sy_type->yp_flags & YP_IMPORTED) ! 400: continue; ! 401: if (sy->sy_type->yp_direction & YP_PRINTER || Aflag) ! 402: fprintf(fptab, "\t%s%s,\n", PTABLE, proc_name(sy->sy_name, 0)); ! 403: } ! 404: fprintf(fptab, "\t};\n\n"); ! 405: ! 406: /* produce pointer table */ ! 407: dump_ptrtab(fptab); ! 408: } ! 409: ! 410: /* ! 411: * output the module structure for this module ! 412: */ ! 413: gen_modtype(tab, no, f1, f2, f3) ! 414: char *tab; ! 415: int no; ! 416: int f1, f2, f3; ! 417: { ! 418: if (!f1) ! 419: fprintf(fptab, "extern PE\t%s%s();\n", ENC_FNCNAME, tab); ! 420: if (!f2) ! 421: fprintf(fptab, "extern PE\t%s%s();\n", DEC_FNCNAME, tab); ! 422: if (!f3) ! 423: fprintf(fptab, "extern PE\t%s%s();\n", PRNT_FNCNAME, tab); ! 424: fprintf(fptab, "\n"); ! 425: fprintf(fptab, "modtyp %s%s%s = {\n", PREFIX, tab, MODTYP_SUFFIX); ! 426: fprintf(fptab, "\t\"%s\",\n", mymodule); /* name */ ! 427: fprintf(fptab, "\t%d,\n", no); /* number of entries */ ! 428: /* coding tables */ ! 429: fprintf(fptab, "\tetabl,\n"); ! 430: fprintf(fptab, "\tdtabl,\n"); ! 431: fprintf(fptab, "\tptabl,\n"); ! 432: /* action tables - may disappear */ ! 433: fprintf(fptab, "\t0,\n"); /* no action code */ ! 434: fprintf(fptab, "\t0,\n"); ! 435: fprintf(fptab, "\t0,\n"); ! 436: ! 437: fprintf(fptab, "\t%s%s%s,\n", PREFIX, PTR_TABNAME, tab); ! 438: fprintf(fptab, "\t};\n\n"); ! 439: } ! 440: ! 441: /* ! 442: * open a file called name ! 443: */ ! 444: FILE * ! 445: ffopen(name) ! 446: char *name; ! 447: { ! 448: FILE *fp; ! 449: ! 450: if ((fp = fopen(name, "w")) == NULL) { ! 451: fprintf(stderr, "Can't create the file %s", name); ! 452: exit(1); ! 453: } ! 454: return fp; ! 455: } ! 456: ! 457: #ifdef ACT_CODE ! 458: /* ! 459: * output the file prologue to the file specified by fp ! 460: */ ! 461: file_header(fp, act) ! 462: FILE *fp; ! 463: char *act; ! 464: { ! 465: fprintf(fp, "#include %s\n", PSAP_DOT_H); ! 466: fprintf(fp, "#include \"%s\"\n", INCFILE1); ! 467: fprintf(fp, "#include \"%s\"\n", act); ! 468: fprintf(fp, "#include \"%s%s\"\n\n", mymodule, GENTYPES); ! 469: fprintf(fp, "#ifndef PEPYPARM\n"); ! 470: fprintf(fp, "#define PEPYPARM char *\n"); ! 471: fprintf(fp, "#endif\n"); ! 472: fprintf(fp, "extern PEPYPARM NullParm;\n\n"); ! 473: } ! 474: ! 475: #endif ! 476: ! 477: /* ! 478: * output the function prologue to the file specified by fp ! 479: */ ! 480: open_func(fp) ! 481: FILE *fp; ! 482: { ! 483: ! 484: fprintf(fp, "(pe, parm, p, mod)\n"); ! 485: fprintf(fp, "PE\tpe;\n"); ! 486: fprintf(fp, "PEPYPARM\tparm;\n"); ! 487: fprintf(fp, "tpe\t*p;\n"); ! 488: fprintf(fp, "modtyp\t*mod;\n"); ! 489: fprintf(fp, "{\n"); ! 490: /* action 0 ???? */ ! 491: fprintf(fp, "\tswitch (p->pe_ucode) {\n"); ! 492: } ! 493: ! 494: /* ! 495: * output the function epilogue to the file specified by fp ! 496: */ ! 497: close_func(fp) ! 498: FILE *fp; ! 499: { ! 500: fprintf(fp, "\t\tdefault:\n"); ! 501: fprintf(fp, "\t\t\tbreak;\n"); ! 502: fprintf(fp, "\t}\n"); ! 503: fprintf(fp, "\treturn OK;\n}\n\n"); ! 504: } ! 505: ! 506: /* ! 507: * print the table id_table ! 508: */ ! 509: print_table() ! 510: { ! 511: int i; ! 512: id_entry *t; ! 513: ! 514: for (i = 0; i < TABLESIZE; i++) { ! 515: for (t = id_table[i]; t != NULL; t = t->next) ! 516: printf("%s(%d) --> ", t->r_value, t->def_value); ! 517: if (id_table[i] != NULL) ! 518: printf("NULL -- %d\n", i); ! 519: } ! 520: } ! 521: ! 522: static struct univ_typ univ_tab[] = { ! 523: {"EXTERNAL", "struct type_UNIV_EXTERNAL *", "EXTERNAL", 8, 0, ! 524: "UNIV", UNF_EXTMOD, YP_UNDF, }, ! 525: {"GeneralString", "struct qbuf *", "OCTETSTRING", 27, 0, ! 526: "UNIV", 0, YP_OCT, }, ! 527: {"GeneralisedTime", "struct qbuf *", "OCTETSTRING", 24, 0, ! 528: "UNIV", 0, YP_OCT, }, ! 529: {"GeneralizedTime", "struct qbuf *", "OCTETSTRING", 24, 0, ! 530: "UNIV", 0, YP_OCT, }, ! 531: {"GraphicString", "struct qbuf *", "OCTETSTRING", 25, 0, ! 532: "UNIV", 0, YP_OCT, }, ! 533: {"IA5String", "struct qbuf *", "OCTETSTRING", 22, 0, ! 534: "UNIV", 0, YP_OCT, }, ! 535: {"ISO646String", "struct qbuf *", "OCTETSTRING", 26, 0, ! 536: "UNIV", 0, YP_OCT, }, ! 537: {"NumericString", "struct qbuf *", "OCTETSTRING", 18, 0, ! 538: "UNIV", 0, YP_OCT, }, ! 539: {"PrintableString", "struct qbuf *", "OCTETSTRING", 19, 0, ! 540: "UNIV", 0, YP_OCT, }, ! 541: {"TeletexString", "struct qbuf *", "OCTETSTRING", 20, 0, ! 542: "UNIV", 0, YP_OCT, }, ! 543: {"T61String", "struct qbuf *", "OCTETSTRING", 20, 0, ! 544: "UNIV", 0, YP_OCT, }, ! 545: {"UTCTime", "struct qbuf *", "OCTETSTRING", 23, 0, ! 546: "UNIV", 0, YP_OCT, }, ! 547: {"UniversalTime", "struct qbuf *", "OCTETSTRING", 23, 0, ! 548: "UNIV", 0, YP_OCT, }, ! 549: {"VideotexString", "struct qbuf *", "OCTETSTRING", 21, 0, ! 550: "UNIV", 0, YP_OCT, }, ! 551: {"VisibleString", "struct qbuf *", "OCTETSTRING", 26, 0, ! 552: "UNIV", 0, YP_OCT, }, ! 553: }; ! 554: ! 555: extern struct univ_typ *simptyp(); ! 556: ! 557: /* ! 558: * Determine wether the type name matches one of the Universal types ! 559: * which are to be treated specially. If so return a pointer to the ! 560: * data structure which contains the parameters describing how it ! 561: * should be processed ! 562: */ ! 563: struct univ_typ * ! 564: univtyp(name) ! 565: char *name; ! 566: { ! 567: int low, high, i; ! 568: struct univ_typ *p; ! 569: ! 570: low = 0; ! 571: high = NENTRIES(univ_tab) - 1; ! 572: while (low <= high) { ! 573: p = univ_tab + (low + high) / 2; ! 574: if ((i = scmp(name, p->univ_name)) == 0) ! 575: return (p); ! 576: if (low == high) ! 577: return (NULL); ! 578: if (i < 0) ! 579: high = p - univ_tab - 1; ! 580: else ! 581: low = p - univ_tab + 1; ! 582: } ! 583: ! 584: #if OPTIMISED ! 585: if ((p = simptyp(name)) == NULL) ! 586: return (p); ! 587: #endif ! 588: ! 589: return (NULL); ! 590: } ! 591: ! 592: /* ! 593: * Compare two strings returning a number representing the character ! 594: * where they differ or 0 if are the same - I wrote this because I ! 595: * couldn't trust strcmp to work the same way between numbers and ! 596: * letters everywhere. longer strings are greater shorter strings ! 597: * numbers are greater then all letters lower case are greater then ! 598: * upper case There must be a better way ! ! 599: */ ! 600: scmp(s1, s2) ! 601: char *s1, *s2; ! 602: { ! 603: while (*s1 == *s2 && *s2) ! 604: s1++, s2++; ! 605: if (*s1 == '\0' && *s2 == '\0') ! 606: return (0); ! 607: if (*s1 == '\0') ! 608: return (-1); ! 609: if (*s2 == '\0') ! 610: return (1); ! 611: if (isalpha(*s1) && isalpha(*s2)) { ! 612: if (isupper(*s1) && isupper(*s2)) ! 613: return (*s1 - *s2); ! 614: if (islower(*s1) && islower(*s1)) ! 615: return (*s1 - *s2); ! 616: if (isupper(*s1)) ! 617: return (-1); ! 618: if (islower(*s1)) ! 619: return (1); ! 620: } ! 621: if (isdigit(*s1) && isdigit(*s2)) ! 622: return (*s1 - *s2); ! 623: if (isdigit(*s1)) ! 624: return (1); ! 625: if (isdigit(*s2)) ! 626: return (-1); ! 627: return (*s1 - *s2); ! 628: } ! 629: ! 630: /* ! 631: * lookup a symbol and return a pointer to it ! 632: */ ! 633: SY ! 634: syfind(name) ! 635: char *name; ! 636: { ! 637: SY sy; ! 638: ! 639: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 640: if (sy->sy_type->yp_flags & YP_IMPORTED) ! 641: continue; ! 642: if (strcmp(name, sy->sy_name) == 0) ! 643: return (sy); ! 644: } ! 645: return (NULL); ! 646: } ! 647: /* ! 648: * determine if the symbol is a simple type that is optimised ! 649: */ ! 650: struct univ_typ * ! 651: simptyp(yp) ! 652: YP yp; ! 653: { ! 654: struct univ_typ *p; ! 655: YP y; ! 656: ! 657: static struct univ_typ bitstring = ! 658: {"Bitstring", "struct PElement *", "BITSTRING", 3, 0}, ! 659: octetstring = ! 660: {"GeneralString", "struct qbuf *", "OCTETSTRING", 4, 0}, ! 661: oid = ! 662: {"Object Identifier", "struct OIDentifier *", "OBJIDENT", 6, 0}, ! 663: obj = ! 664: {"Module", "struct OIDentifier *", ! 665: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 27, 0}; ! 666: ! 667: #define MSTRING 30 /* number of Xs in the above string */ ! 668: ! 669: switch (yp->yp_code) { ! 670: case YP_BIT: ! 671: case YP_BITLIST: ! 672: return (&bitstring); ! 673: ! 674: case YP_SEQ: ! 675: case YP_SET: ! 676: case YP_ANY: ! 677: return (&bitstring); ! 678: ! 679: case YP_OCT: ! 680: return (&octetstring); ! 681: ! 682: case YP_OID: ! 683: return (&oid); ! 684: ! 685: case YP_IDEFINED: ! 686: strncpy(p->univ_tab, yp->yp_identifier, MSTRING); ! 687: return (&obj); ! 688: ! 689: ! 690: case YP_SEQLIST: ! 691: case YP_SETLIST: ! 692: case YP_CHOICE: ! 693: #if 0 ! 694: if (hflag && (y = yp->yp_type) && !y->yp_next) { ! 695: ferr(1, "simtyp: -h flag not implemented\n"); ! 696: return (NULL); ! 697: } ! 698: #endif ! 699: ! 700: default: ! 701: return (NULL); ! 702: } ! 703: } ! 704: ! 705: /* ! 706: * Generate function definitions for all the macros so that lint ! 707: * can type check all thier uses ! 708: */ ! 709: gen_lint(fp) ! 710: FILE *fp; ! 711: { ! 712: char *buf, *tab; ! 713: SY sy; ! 714: YP yp; ! 715: ! 716: fprintf(fp, "\n#ifdef\tlint\n"); ! 717: tab = notidtoid(mymodule); ! 718: for (sy = mysymbols; sy; sy = sy->sy_next) { ! 719: eval = sy->sy_name; ! 720: yp = sy->sy_type; ! 721: ! 722: if (sy->sy_module == NULLCP) ! 723: yyerror("no module name associated with symbol"); ! 724: if (yp->yp_flags & YP_IMPORTED) ! 725: continue; ! 726: if (strcmp(sy->sy_module, mymodule)) { ! 727: fprintf(stderr, ! 728: "mymodule unsuitable for module name e.g %s and %s(mymodule)\n", ! 729: sy->sy_module, mymodule); ! 730: exit(1); ! 731: } ! 732: /* Encoding routine */ ! 733: buf = modsym (sy -> sy_module, sy -> sy_name, yyencdflt); ! 734: fprintf(fp, "\n#undef %s\n", buf); ! 735: fprintf(fp, "int %s", buf); ! 736: fprintf(fp, "(pe, top, len, buffer, parm)\n"); ! 737: fprintf(fp, "PE *pe;\n"); ! 738: fprintf(fp, "int top,\n\tlen;\n"); ! 739: fprintf(fp, "char buffer;\n"); ! 740: fprintf(fp, "struct %s parm;\n", ! 741: modsym(sy->sy_module, sy->sy_name, "type")); ! 742: fprintf(fp, "{\n return (%s(%s%s, ", ! 743: ENCFNCNAME, PREFIX, proc_name(sy->sy_name, 1)); ! 744: fprintf(fp, "&%s%s%s, ", PREFIX, tab, MODTYP_SUFFIX); ! 745: fprintf(fp, "pe, top, len, buffer, (char *) parm)\n}\n"); ! 746: ! 747: /* Decoding routine */ ! 748: buf = modsym (sy -> sy_module, sy -> sy_name, yydecdflt); ! 749: fprintf(fp, "\n#undef %s\n", buf); ! 750: fprintf(fp, "int %s", buf); ! 751: fprintf(fp, "(pe, top, len, buffer, parm)\n"); ! 752: fprintf(fp, "PE pe;\n"); ! 753: fprintf(fp, "int top,\n\t*len;\n"); ! 754: fprintf(fp, "char *buffer;\n"); ! 755: fprintf(fp, "struct %s parm;\n", ! 756: modsym(sy->sy_module, sy->sy_name, "type")); ! 757: fprintf(fp, "{\n return (%s(%s%s, ", ! 758: DECFNCNAME, PREFIX, proc_name(sy->sy_name, 1)); ! 759: fprintf(fp, "&%s%s%s, ", PREFIX, tab, MODTYP_SUFFIX); ! 760: fprintf(fp, "pe, top, len, buffer, (char *) parm)\n}\n"); ! 761: ! 762: ! 763: /* Printing routine */ ! 764: buf = modsym (sy -> sy_module, sy -> sy_name, yyprfdflt); ! 765: fprintf(fp, "\n#undef %s\n", buf); ! 766: fprintf(fp, "int %s", buf); ! 767: fprintf(fp, "(pe, top, len, buffer, parm)\n"); ! 768: fprintf(fp, "PE pe;\n"); ! 769: fprintf(fp, "int top,\n\t*len;\n"); ! 770: fprintf(fp, "char *buffer;\n"); ! 771: fprintf(fp, "struct %s parm;\n", ! 772: modsym(sy->sy_module, sy->sy_name, "type")); ! 773: fprintf(fp, "{\n return (%s(%s%s, ", ! 774: PRNTFNCNAME, PREFIX, proc_name(sy->sy_name, 1)); ! 775: fprintf(fp, "&%s%s%s, ", PREFIX, tab, MODTYP_SUFFIX); ! 776: fprintf(fp, "pe, top, len, buffer, (char *) parm)\n}\n"); ! 777: ! 778: if (ferror(fp)) ! 779: myyerror("write error - %s", sys_errname(errno)); ! 780: } ! 781: fprintf(fp, "\n#endif\t/* lint */\n"); ! 782: } ! 783: ! 784: /* ! 785: * pointer table support routines ! 786: */ ! 787: static char *ptr_tab[MAXPTRS]; /* reference of the pointer */ ! 788: static int ptr_cnt = 0; ! 789: ! 790: /* ! 791: * add the given pointer to the pointer table and return its index ! 792: */ ! 793: addptr(p) ! 794: char *p; ! 795: { ! 796: int ind; ! 797: register int i; ! 798: register char *s; ! 799: ! 800: /* ! 801: * try to eliminate common pointers by returning a ponter if it matches ! 802: * previously ! 803: */ ! 804: for (i = 0; i < ptr_cnt; i++) ! 805: if (strcmp(p, ptr_tab[i]) == 0) ! 806: return (i); ! 807: ! 808: if (ptr_cnt >= MAXPTRS) { ! 809: fprintf(stderr, "\npointer table overflow %d\n", ptr_cnt); ! 810: exit(1); ! 811: } ! 812: ! 813: if ((s = malloc ((unsigned) (strlen (p) + 1))) == NULLCP) { ! 814: fprintf(stderr, "\naddptr:out of memory\n"); ! 815: exit(1); ! 816: } ! 817: (void) strcpy (s, p); ! 818: ! 819: ptr_tab[ind = ptr_cnt++] = s; ! 820: ! 821: return (ind); ! 822: } ! 823: ! 824: ! 825: dump_ptrtab(fp) ! 826: FILE *fp; ! 827: { ! 828: char *tab; ! 829: int i; ! 830: ! 831: tab = notidtoid(mymodule); ! 832: ! 833: fprintf(fp, "\n/* Pointer table %d entries */\n", ptr_cnt); ! 834: fprintf(fp, "static caddr_t %s%s%s[] = {\n", PREFIX, PTR_TABNAME, tab); ! 835: ! 836: for (i = 0; i < ptr_cnt; i++) ! 837: fprintf(fp, " (caddr_t ) %s,\n", ptr_tab[i]); ! 838: ! 839: if (ptr_cnt <= 0) ! 840: fprintf(fp, " (caddr_t ) 0,\n"); /* for fussy C compilers */ ! 841: ! 842: fprintf(fp, "};\n"); ! 843: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.