|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/stat.h> ! 3: #include <errno.h> ! 4: #include <signal.h> ! 5: #include <stdio.h> ! 6: ! 7: /* ! 8: * Compiler front end program. ! 9: * ! 10: * Bruce Ellis - September 1984. ! 11: */ ! 12: ! 13: /* ! 14: * Argument list structures. ! 15: */ ! 16: typedef struct arg arg; ! 17: ! 18: struct arg ! 19: { ! 20: char *a_str; ! 21: arg *a_next; ! 22: }; ! 23: ! 24: typedef struct ! 25: { ! 26: arg *a_head; ! 27: arg **a_tail; ! 28: } ! 29: args; ! 30: ! 31: /* ! 32: * Option structures. ! 33: */ ! 34: typedef enum ! 35: { ! 36: c_bad, ! 37: c_flag, ! 38: c_function, ! 39: c_negate, ! 40: c_str_arg, ! 41: c_str_func, ! 42: c_string, ! 43: } ! 44: opcode; ! 45: ! 46: typedef struct ! 47: { ! 48: opcode o_code; ! 49: args **o_args; ! 50: int *o_flag; ! 51: int (*o_func)(); ! 52: } ! 53: option; ! 54: ! 55: /* ! 56: * Exec argument structures. ! 57: */ ! 58: typedef enum ! 59: { ! 60: e_args, ! 61: e_input, ! 62: e_literal, ! 63: e_output, ! 64: e_splice, ! 65: e_string, ! 66: } ! 67: eatype; ! 68: ! 69: typedef struct earg earg; ! 70: ! 71: struct earg ! 72: { ! 73: eatype e_code; ! 74: char *e_str; ! 75: char **e_strp; ! 76: args **e_args; ! 77: int e_count; ! 78: earg *e_next; ! 79: }; ! 80: ! 81: typedef struct ! 82: { ! 83: char *e_path; ! 84: earg *e_list; ! 85: } ! 86: eargs; ! 87: ! 88: args *files; ! 89: char **tempv; ! 90: char *input; ! 91: char *my_name; ! 92: char *output; ! 93: char *object; ! 94: int ntemps; ! 95: int verbose; ! 96: ! 97: extern int errno; ! 98: extern char *strcpy(); ! 99: extern char *strrchr(); ! 100: extern int strlen(); ! 101: ! 102: /* ! 103: * Cyntax. ! 104: */ ! 105: args *comp_args; ! 106: args *cpp_args; ! 107: args *load_args; ! 108: char *load_out; ! 109: char *src_name; ! 110: int cflag; ! 111: int gflag; ! 112: int hflag; ! 113: int jerq; ! 114: int multi_cfile; ! 115: int pflag; ! 116: int sflag; ! 117: int ugflag; ! 118: int ulflag; ! 119: int uoflag; ! 120: int upflag; ! 121: int uzflag; ! 122: ! 123: /* ! 124: * Path names. ! 125: */ ! 126: #define CPP_PATH "/lib/cpp" ! 127: #define CPP_NAME "cpp" ! 128: #define COMP_PATH "/usr/lib/cyntax/ccom" ! 129: #define COMP_NAME "ccom" ! 130: #define SETS_PATH "/lib/sets" ! 131: #define SETS_NAME "sets" ! 132: #define COMP_PATH "/usr/lib/cyntax/ccom" ! 133: #define DEBUG_PATH "/user1/other/brucee/mh/c/bin/ccom.debug" ! 134: #define LPROF_PATH "/user1/other/brucee/mh/c/bin/ccom.lcomp" ! 135: #define PROFILE_PATH "/user1/other/brucee/mh/c/bin/ccom.prof" ! 136: #define COMP_NAME "ccom" ! 137: #define LOAD_PATH "/usr/lib/cyntax/cem" ! 138: #define LOAD_NAME "cem" ! 139: ! 140: #define DEF_OUT "a.out" ! 141: #define DEF_LIB "-lc" ! 142: #define JERQ_INCLUDE "-I/usr/jerq/include" ! 143: #define JERQ_LIB "-lj" ! 144: #define DEF_MUX "-DMUX" ! 145: #define TMP_DIR "/tmp" ! 146: ! 147: extern int dflag(); ! 148: extern int jflag(); ! 149: extern int mflag(); ! 150: extern int wflag(); ! 151: extern int ostring(); ! 152: ! 153: /* ! 154: * Lower case option table. ! 155: */ ! 156: option lcase[26] = ! 157: { ! 158: /* a */ {c_bad, NULL, NULL, NULL}, ! 159: /* b */ {c_bad, NULL, NULL, NULL}, ! 160: /* c */ {c_flag, NULL, &cflag, NULL}, ! 161: /* d */ {c_str_func, NULL, NULL, dflag}, ! 162: /* e */ {c_bad, NULL, NULL, NULL}, ! 163: /* f */ {c_bad, NULL, NULL, NULL}, ! 164: /* g */ {c_flag, NULL, &gflag, NULL}, ! 165: /* h */ {c_flag, NULL, &hflag, NULL}, ! 166: /* i */ {c_bad, NULL, NULL, NULL}, ! 167: /* j */ {c_function, NULL, NULL, jflag}, ! 168: /* k */ {c_bad, NULL, NULL, NULL}, ! 169: /* l */ {c_string, &files, NULL, NULL}, ! 170: /* m */ {c_function, NULL, NULL, mflag}, ! 171: /* n */ {c_bad, NULL, NULL, NULL}, ! 172: /* o */ {c_str_func, NULL, NULL, ostring}, ! 173: /* p */ {c_flag, NULL, &pflag, NULL}, ! 174: /* q */ {c_bad, NULL, NULL, NULL}, ! 175: /* r */ {c_bad, NULL, NULL, NULL}, ! 176: /* s */ {c_flag, NULL, &sflag, NULL}, ! 177: /* t */ {c_bad, NULL, NULL, NULL}, ! 178: /* u */ {c_bad, NULL, NULL, NULL}, ! 179: /* v */ {c_flag, NULL, &verbose, NULL}, ! 180: /* w */ {c_function, NULL, NULL, wflag}, ! 181: /* x */ {c_bad, NULL, NULL, NULL}, ! 182: /* y */ {c_bad, NULL, NULL, NULL}, ! 183: /* z */ {c_bad, NULL, NULL, NULL}, ! 184: }; ! 185: ! 186: /* ! 187: * Upper case option table. ! 188: */ ! 189: option ucase[26] = ! 190: { ! 191: /* A */ {c_bad, NULL, NULL, NULL}, ! 192: /* B */ {c_bad, NULL, NULL, NULL}, ! 193: /* C */ {c_bad, NULL, NULL, NULL}, ! 194: /* D */ {c_string, &cpp_args, NULL, NULL}, ! 195: /* E */ {c_bad, NULL, NULL, NULL}, ! 196: /* F */ {c_bad, NULL, NULL, NULL}, ! 197: /* G */ {c_flag, NULL, &ugflag, NULL}, ! 198: /* H */ {c_bad, NULL, NULL, NULL}, ! 199: /* I */ {c_string, &cpp_args, NULL, NULL}, ! 200: /* J */ {c_bad, NULL, NULL, NULL}, ! 201: /* K */ {c_bad, NULL, NULL, NULL}, ! 202: /* L */ {c_flag, NULL, &ulflag, NULL}, ! 203: /* M */ {c_bad, NULL, NULL, NULL}, ! 204: /* N */ {c_bad, NULL, NULL, NULL}, ! 205: /* O */ {c_flag, NULL, &uoflag, NULL}, ! 206: /* P */ {c_flag, NULL, &upflag, NULL}, ! 207: /* Q */ {c_bad, NULL, NULL, NULL}, ! 208: /* R */ {c_bad, NULL, NULL, NULL}, ! 209: /* S */ {c_bad, NULL, NULL, NULL}, ! 210: /* T */ {c_bad, NULL, NULL, NULL}, ! 211: /* U */ {c_string, &cpp_args, NULL, NULL}, ! 212: /* V */ {c_string, &comp_args, NULL, NULL}, ! 213: /* W */ {c_bad, NULL, NULL, NULL}, ! 214: /* X */ {c_bad, NULL, NULL, NULL}, ! 215: /* Y */ {c_bad, NULL, NULL, NULL}, ! 216: /* Z */ {c_flag, NULL, &uzflag, NULL}, ! 217: }; ! 218: ! 219: /* ! 220: * Programs to be called. ! 221: */ ! 222: earg cpp_list[] = ! 223: { ! 224: {e_literal, CPP_NAME, NULL, NULL, 0, &cpp_list[1]}, ! 225: {e_literal, "-M", NULL, NULL, 0, &cpp_list[2]}, ! 226: {e_args, NULL, NULL, &cpp_args, 0, &cpp_list[3]}, ! 227: {e_input, NULL, NULL, NULL, 0, &cpp_list[4]}, ! 228: {e_output, NULL, NULL, NULL, 0, NULL}, ! 229: }; ! 230: ! 231: earg sets_list[] = ! 232: { ! 233: {e_literal, SETS_NAME, NULL, NULL, 0, &sets_list[1]}, ! 234: {e_input, NULL, NULL, NULL, 0, &sets_list[2]}, ! 235: {e_output, NULL, NULL, NULL, 0, NULL}, ! 236: }; ! 237: ! 238: earg comp_list[] = ! 239: { ! 240: {e_literal, COMP_NAME, NULL, NULL, 0, &comp_list[1]}, ! 241: {e_literal, "-O", NULL, NULL, 0, &comp_list[2]}, ! 242: {e_splice, NULL, NULL, NULL, 2, &comp_list[3]}, ! 243: {e_literal, "-f", NULL, NULL, 0, &comp_list[4]}, ! 244: {e_string, NULL, &src_name, NULL, 0, &comp_list[5]}, ! 245: {e_args, NULL, NULL, &comp_args, 0, &comp_list[6]}, ! 246: {e_input, NULL, NULL, NULL, 0, &comp_list[7]}, ! 247: {e_output, NULL, NULL, NULL, 0, NULL}, ! 248: }; ! 249: ! 250: earg load_list[] = ! 251: { ! 252: {e_literal, LOAD_NAME, NULL, NULL, 0, &load_list[1]}, ! 253: {e_args, NULL, NULL, &load_args, 0, &load_list[2]}, ! 254: {e_args, NULL, NULL, &files, 0, &load_list[3]}, ! 255: {e_literal, "-o", NULL, NULL, 0, &load_list[4]}, ! 256: {e_output, NULL, NULL, NULL, 0, NULL}, ! 257: }; ! 258: ! 259: eargs cpp_eargs = {CPP_PATH, cpp_list}; ! 260: eargs sets_eargs = {SETS_PATH, sets_list}; ! 261: eargs comp_eargs = {COMP_PATH, comp_list}; ! 262: eargs load_eargs = {LOAD_PATH, load_list}; ! 263: ! 264: /* ! 265: * General ruotines. ! 266: */ ! 267: ! 268: #define talloc(t) (t *)salloc(sizeof (t)) ! 269: ! 270: /* ! 271: * Remove temporaries and exit. ! 272: */ ! 273: void ! 274: quit(s) ! 275: int s; ! 276: { ! 277: register int i; ! 278: ! 279: for (i = 0; i < ntemps; i++) ! 280: { ! 281: if (tempv[i] != NULL) ! 282: (void)unlink(tempv[i]); ! 283: } ! 284: ! 285: if (object != NULL) ! 286: (void)unlink(object); ! 287: ! 288: exit(s); ! 289: } ! 290: ! 291: /* ! 292: * Internal error. ! 293: */ ! 294: void ! 295: internal(s) ! 296: char *s; ! 297: { ! 298: fprintf(stderr, "%s: internal error - %s\n", my_name, s); ! 299: quit(1); ! 300: } ! 301: ! 302: /* ! 303: * Interrupt routine. ! 304: */ ! 305: int ! 306: rubbed() ! 307: { ! 308: quit(1); ! 309: } ! 310: ! 311: /* ! 312: * System error. ! 313: */ ! 314: perr(s) ! 315: char *s; ! 316: { ! 317: fprintf(stderr, "%s: ", my_name); ! 318: perror(s); ! 319: quit(1); ! 320: } ! 321: ! 322: /* ! 323: * Memory allocation. ! 324: */ ! 325: char * ! 326: salloc(n) ! 327: int n; ! 328: { ! 329: register char *p; ! 330: extern char *malloc(); ! 331: ! 332: if ((p = malloc((unsigned int)n)) == NULL) ! 333: { ! 334: fprintf(stderr, "%s: ran out of memory\n", my_name); ! 335: quit(1); ! 336: } ! 337: ! 338: return p; ! 339: } ! 340: ! 341: char * ! 342: srealloc(p, n) ! 343: register char *p; ! 344: int n; ! 345: { ! 346: extern char *realloc(); ! 347: ! 348: if (p == NULL) ! 349: return salloc(n); ! 350: else if ((p = realloc(p, (unsigned int)n)) == NULL) ! 351: { ! 352: fprintf(stderr, "%s: ran out of memory\n", my_name); ! 353: quit(1); ! 354: } ! 355: ! 356: return p; ! 357: } ! 358: ! 359: /* ! 360: * Copy a string. ! 361: */ ! 362: char * ! 363: copy(s) ! 364: char *s; ! 365: { ! 366: return strcpy(salloc(strlen(s) + 1), s); ! 367: } ! 368: ! 369: /* ! 370: * File suffix. ! 371: */ ! 372: int ! 373: suffix(s) ! 374: register char *s; ! 375: { ! 376: register int i; ! 377: ! 378: if ((i = strlen(s)) < 2 || s[i - 2] != '.') ! 379: return '\0'; ! 380: else ! 381: return s[i - 1]; ! 382: } ! 383: ! 384: /* ! 385: * Replace file suffix. ! 386: */ ! 387: void ! 388: replace_suffix(s, c) ! 389: char *s; ! 390: int c; ! 391: { ! 392: s[strlen(s) - 1] = c; ! 393: } ! 394: ! 395: /* ! 396: * Construct a temporary file name. ! 397: */ ! 398: char * ! 399: make_temp(sp, i) ! 400: char **sp; ! 401: int i; ! 402: { ! 403: char letter; ! 404: char buff[64]; ! 405: struct stat statb; ! 406: static int pid; ! 407: ! 408: if (*sp != NULL) ! 409: return *sp; ! 410: ! 411: if (pid == 0) ! 412: pid = getpid(); ! 413: ! 414: letter = 'a'; ! 415: ! 416: for (;;) ! 417: { ! 418: sprintf(buff, "%s/ctm%05d_%02d%c", TMP_DIR, pid, i, letter); ! 419: ! 420: if (stat(buff, &statb) == -1) ! 421: { ! 422: if (errno == ENOENT) ! 423: { ! 424: *sp = copy(buff); ! 425: return *sp; ! 426: } ! 427: ! 428: perr(buff); ! 429: quit(1); ! 430: } ! 431: ! 432: letter++; ! 433: } ! 434: } ! 435: ! 436: /* ! 437: * Add an argument to a list. ! 438: */ ! 439: void ! 440: add_arg(s, p) ! 441: char *s; ! 442: register args *p; ! 443: { ! 444: register arg *a; ! 445: ! 446: a = talloc(arg); ! 447: a->a_str = s; ! 448: a->a_next = NULL; ! 449: *p->a_tail = a; ! 450: p->a_tail = &a->a_next; ! 451: } ! 452: ! 453: /* ! 454: * Construct a new argument list. ! 455: */ ! 456: args * ! 457: new_args() ! 458: { ! 459: register args *p; ! 460: ! 461: p = talloc(args); ! 462: p->a_head = NULL; ! 463: p->a_tail = &p->a_head; ! 464: return p; ! 465: } ! 466: ! 467: /* ! 468: * Free an argument list. ! 469: */ ! 470: void ! 471: free_args(a) ! 472: args *a; ! 473: { ! 474: register arg *p; ! 475: register arg *q; ! 476: ! 477: for (p = a->a_head; p != NULL; p = q) ! 478: { ! 479: q = p->a_next; ! 480: free((char *)p); ! 481: } ! 482: ! 483: free((char *)a); ! 484: } ! 485: ! 486: /* ! 487: * Make a string out of the catenation of an argument list. ! 488: */ ! 489: char * ! 490: cat_args(a) ! 491: args *a; ! 492: { ! 493: register arg *p; ! 494: register int i; ! 495: register char *s; ! 496: register char *t; ! 497: ! 498: for (i = 1, p = a->a_head; p != NULL; p = p->a_next) ! 499: i += strlen(p->a_str); ! 500: ! 501: s = salloc(i); ! 502: t = s; ! 503: ! 504: for (p = a->a_head; p != NULL; p = p->a_next) ! 505: { ! 506: (void)strcpy(s, p->a_str); ! 507: s += strlen(p->a_str); ! 508: } ! 509: ! 510: return t; ! 511: } ! 512: ! 513: /* ! 514: * Copy an argument list. ! 515: */ ! 516: void ! 517: cp_args(from, to) ! 518: args *from; ! 519: register args *to; ! 520: { ! 521: register arg *p; ! 522: ! 523: for (p = from->a_head; p != NULL; p = p->a_next) ! 524: add_arg(p->a_str, to); ! 525: } ! 526: ! 527: /* ! 528: * Add an exec argument and return a pointer to the next item. ! 529: */ ! 530: earg * ! 531: add_exec_arg(e, a) ! 532: register earg *e; ! 533: register args *a; ! 534: { ! 535: register int i; ! 536: register char *s; ! 537: register char *t; ! 538: args *temp; ! 539: ! 540: switch (e->e_code) ! 541: { ! 542: case e_args: ! 543: cp_args(*e->e_args, a); ! 544: break; ! 545: ! 546: case e_input: ! 547: add_arg(input, a); ! 548: break; ! 549: ! 550: case e_literal: ! 551: add_arg(e->e_str, a); ! 552: break; ! 553: ! 554: case e_output: ! 555: add_arg(output, a); ! 556: break; ! 557: ! 558: case e_splice: ! 559: s = copy(""); ! 560: i = e->e_count; ! 561: e = e->e_next; ! 562: ! 563: while (--i >= 0) ! 564: { ! 565: if (e == NULL) ! 566: internal("bad splice"); ! 567: ! 568: temp = new_args(); ! 569: add_arg(s, temp); ! 570: e = add_exec_arg(e, temp); ! 571: t = cat_args(temp); ! 572: free(s); ! 573: free_args(temp); ! 574: s = t; ! 575: } ! 576: ! 577: add_arg(s, a); ! 578: return e; ! 579: ! 580: case e_string: ! 581: add_arg(*e->e_strp, a); ! 582: break; ! 583: ! 584: default: ! 585: internal("bad ecode switch"); ! 586: } ! 587: ! 588: return e->e_next; ! 589: } ! 590: ! 591: /* ! 592: * Argument processing. ! 593: */ ! 594: int ! 595: options(n, v) ! 596: register int n; ! 597: register char **v; ! 598: { ! 599: register char *p; ! 600: register int c; ! 601: register option *o; ! 602: ! 603: while (--n >= 0) ! 604: { ! 605: if (**v == '-') ! 606: { ! 607: p = *v++; ! 608: ! 609: while ((c = *++p) != '\0') ! 610: { ! 611: if (c >= 'a' && c <= 'z') ! 612: o = &lcase[c - 'a']; ! 613: else if (c >= 'A' && c <= 'Z') ! 614: o = &ucase[c - 'A']; ! 615: else ! 616: { ! 617: fprintf(stderr, "%s: unknown option '%c'\n", my_name, c); ! 618: return 1; ! 619: } ! 620: ! 621: switch (o->o_code) ! 622: { ! 623: case c_bad: ! 624: /* ! 625: * Unknown flag. ! 626: */ ! 627: fprintf(stderr, "%s: unknown option '%c'\n", my_name, c); ! 628: return 1; ! 629: ! 630: case c_flag: ! 631: /* ! 632: * Set a flag. ! 633: */ ! 634: *o->o_flag = 1; ! 635: continue; ! 636: ! 637: case c_function: ! 638: /* ! 639: * Call a function. ! 640: */ ! 641: if ((*o->o_func)(o)) ! 642: return 1; ! 643: ! 644: continue; ! 645: ! 646: case c_negate: ! 647: /* ! 648: * Reset a flag. ! 649: */ ! 650: *o->o_flag = 0; ! 651: continue; ! 652: ! 653: case c_str_arg: ! 654: /* ! 655: * Pick up a string argument. ! 656: */ ! 657: if (*++p == '\0') ! 658: { ! 659: if (--n < 0 || *(p = *v++) == '-') ! 660: { ! 661: fprintf(stderr, "%s: argument expected for '-%c' option\n", my_name, c); ! 662: return 1; ! 663: } ! 664: } ! 665: ! 666: add_arg(p, *o->o_args); ! 667: break; ! 668: ! 669: case c_str_func: ! 670: /* ! 671: * Pick up a string and call a function. ! 672: */ ! 673: if (*++p == '\0') ! 674: { ! 675: if (--n < 0 || *(p = *v++) == '-') ! 676: { ! 677: fprintf(stderr, "%s: argument expected for '-%c' option\n", my_name, c); ! 678: return 1; ! 679: } ! 680: } ! 681: ! 682: if ((*o->o_func)(o, p)) ! 683: return 1; ! 684: ! 685: break; ! 686: ! 687: case c_string: ! 688: /* ! 689: * Pick up a complete argument. ! 690: */ ! 691: if (p != &v[-1][1]) ! 692: { ! 693: fprintf(stderr, "%s: bad '%c' option\n", my_name, c); ! 694: return 1; ! 695: } ! 696: ! 697: if (p[1] == '\0') ! 698: { ! 699: fprintf(stderr, "%s: no string for '%c' option\n", my_name, c); ! 700: return 1; ! 701: } ! 702: ! 703: add_arg(v[-1], *o->o_args); ! 704: break; ! 705: ! 706: default: ! 707: internal("bad option switch"); ! 708: return 1; ! 709: } ! 710: ! 711: break; ! 712: } ! 713: } ! 714: else ! 715: add_arg(*v++, files); ! 716: } ! 717: ! 718: return 0; ! 719: } ! 720: ! 721: /* ! 722: * Catch a signal if it isn't being ignored. ! 723: */ ! 724: void ! 725: set_signal(i) ! 726: int i; ! 727: { ! 728: if (signal(i, SIG_IGN) != SIG_IGN) ! 729: (void)signal(i, rubbed); ! 730: } ! 731: ! 732: /* ! 733: * Initialise. ! 734: */ ! 735: void ! 736: init(s) ! 737: char *s; ! 738: { ! 739: if ((my_name = strrchr(s, '/')) == NULL || *++my_name == '\0') ! 740: my_name = s; ! 741: ! 742: files = new_args(); ! 743: ! 744: set_signal(SIGINT); ! 745: set_signal(SIGTERM); ! 746: } ! 747: ! 748: /* ! 749: * Run s on argv. ! 750: */ ! 751: int ! 752: run(s, argv) ! 753: char *s; ! 754: char **argv; ! 755: { ! 756: register int pid; ! 757: register int ret; ! 758: register int (*isig)(); ! 759: register int (*qsig)(); ! 760: int status; ! 761: ! 762: switch (pid = fork()) ! 763: { ! 764: case 0: ! 765: execv(s, argv); ! 766: perr(s); ! 767: ! 768: case -1: ! 769: perr("fork"); ! 770: ! 771: default: ! 772: isig = signal(SIGINT, SIG_IGN); ! 773: qsig = signal(SIGQUIT, SIG_IGN); ! 774: ! 775: while ((ret = wait(&status)) != pid) ! 776: { ! 777: if (ret == -1) ! 778: perr("wait"); ! 779: } ! 780: ! 781: if (isig != SIG_IGN) ! 782: signal(SIGINT, isig); ! 783: ! 784: if (qsig != SIG_IGN) ! 785: signal(SIGQUIT, qsig); ! 786: } ! 787: ! 788: if ((status & 0xFF) != 0) ! 789: { ! 790: if ((status & 0x80) != 0) ! 791: fprintf(stderr, "%s: fatal error in %s (core dumped)\n", my_name, s); ! 792: ! 793: quit(1); ! 794: } ! 795: ! 796: return (status >> 8) & 0xFF; ! 797: } ! 798: ! 799: /* ! 800: * Execute an exec arglist. ! 801: */ ! 802: int ! 803: execute(e) ! 804: eargs *e; ! 805: { ! 806: register int i; ! 807: register earg *p; ! 808: register arg *q; ! 809: args *a; ! 810: static char **argv; ! 811: static int argc; ! 812: ! 813: a = new_args(); ! 814: ! 815: for (p = e->e_list; p != NULL; p = add_exec_arg(p, a)) ! 816: ; ! 817: ! 818: for (i = 1, q = a->a_head; q != NULL; q = q->a_next) ! 819: i++; ! 820: ! 821: if (i > argc) ! 822: argv = (char **)srealloc((char *)argv, i * sizeof (char *)); ! 823: ! 824: for (i = 0, q = a->a_head; q != NULL; q = q->a_next) ! 825: argv[i++] = q->a_str; ! 826: ! 827: if (verbose) ! 828: { ! 829: printf("%s:", e->e_path); ! 830: ! 831: for (q = a->a_head; q != NULL; q = q->a_next) ! 832: printf(" %s", q->a_str); ! 833: ! 834: printf("\n"); ! 835: fflush(stdout); ! 836: } ! 837: ! 838: free_args(a); ! 839: argv[i] = NULL; ! 840: ! 841: return run(e->e_path, argv); ! 842: } ! 843: ! 844: /* ! 845: * Cyntax. ! 846: */ ! 847: ! 848: /* ! 849: * User initialisation. ! 850: */ ! 851: void ! 852: uinit() ! 853: { ! 854: cpp_args = new_args(); ! 855: comp_args = new_args(); ! 856: load_args = new_args(); ! 857: } ! 858: ! 859: /* ! 860: * Handle '-d' flag. ! 861: */ ! 862: int ! 863: dflag(o, s) ! 864: option *o; ! 865: char *s; ! 866: { ! 867: return 0; ! 868: } ! 869: ! 870: /* ! 871: * Handle '-j' flag. ! 872: */ ! 873: int ! 874: jflag(o, s) ! 875: option *o; ! 876: char *s; ! 877: { ! 878: jerq = 1; ! 879: add_arg(JERQ_INCLUDE, cpp_args); ! 880: return 0; ! 881: } ! 882: ! 883: /* ! 884: * Handle '-m' flag. ! 885: */ ! 886: int ! 887: mflag(o, s) ! 888: option *o; ! 889: char *s; ! 890: { ! 891: add_arg(DEF_MUX, cpp_args); ! 892: return 0; ! 893: } ! 894: ! 895: /* ! 896: * Handle '-w' flag. ! 897: */ ! 898: int ! 899: wflag(o, s) ! 900: option *o; ! 901: char *s; ! 902: { ! 903: add_arg("-w", comp_args); ! 904: return 0; ! 905: } ! 906: ! 907: /* ! 908: * Handle '-o' string. ! 909: */ ! 910: int ! 911: ostring(o, s) ! 912: option *o; ! 913: char *s; ! 914: { ! 915: if (load_out != NULL) ! 916: { ! 917: fprintf(stderr, "%s: repeat '-o' option\n", my_name); ! 918: return 1; ! 919: } ! 920: ! 921: load_out = s; ! 922: return 0; ! 923: } ! 924: ! 925: /* ! 926: * Compile the '.c's. ! 927: */ ! 928: int ! 929: compile() ! 930: { ! 931: register int i; ! 932: register int ret; ! 933: register arg *p; ! 934: register char *s; ! 935: struct stat statb; ! 936: ! 937: ret = 0; ! 938: ! 939: if (ugflag) ! 940: comp_eargs.e_path = DEBUG_PATH; ! 941: else if (ulflag) ! 942: comp_eargs.e_path = LPROF_PATH; ! 943: else if (upflag) ! 944: comp_eargs.e_path = PROFILE_PATH; ! 945: ! 946: ntemps = 1; ! 947: ! 948: if (uzflag) ! 949: ntemps++; ! 950: ! 951: tempv = (char **)salloc(ntemps * sizeof (char *)); ! 952: ! 953: for (i = 0; i < ntemps; i++) ! 954: tempv[i] = NULL; ! 955: ! 956: for (p = files->a_head; p != NULL; p = p->a_next) ! 957: { ! 958: switch (suffix(p->a_str)) ! 959: { ! 960: case 'c': ! 961: if (src_name != NULL) ! 962: free(src_name); ! 963: ! 964: if (stat(p->a_str, &statb) == -1) ! 965: src_name = copy(p->a_str); ! 966: else ! 967: { ! 968: src_name = salloc(strlen(p->a_str) + 1 + 12 + 1); ! 969: sprintf(src_name, "%s@%ld", p->a_str, statb.st_mtime); ! 970: } ! 971: ! 972: if (multi_cfile) ! 973: { ! 974: printf("%s:\n", p->a_str); ! 975: fflush(stdout); ! 976: } ! 977: ! 978: i = 0; ! 979: input = p->a_str; ! 980: output = make_temp(&tempv[i], i); ! 981: ! 982: if (execute(&cpp_eargs)) ! 983: { ! 984: ret = 1; ! 985: break; ! 986: } ! 987: ! 988: if (uzflag) ! 989: { ! 990: input = output; ! 991: i = 1 - i; ! 992: output = make_temp(&tempv[i], i); ! 993: ! 994: if (execute(&sets_eargs)) ! 995: { ! 996: ret = 1; ! 997: break; ! 998: } ! 999: } ! 1000: ! 1001: if (hflag && (s = strrchr(p->a_str, '/')) != NULL) ! 1002: p->a_str = s + 1; ! 1003: ! 1004: replace_suffix(p->a_str, 'O'); ! 1005: input = output; ! 1006: output = p->a_str; ! 1007: object = p->a_str; ! 1008: ! 1009: if (execute(&comp_eargs)) ! 1010: { ! 1011: (void)unlink(object); ! 1012: ret = 1; ! 1013: break; ! 1014: } ! 1015: else ! 1016: object = NULL; ! 1017: ! 1018: break; ! 1019: ! 1020: case 'A': ! 1021: case 'O': ! 1022: case '\0': ! 1023: break; ! 1024: ! 1025: default: ! 1026: fprintf(stderr, "%s: unknown file type '%s'\n", my_name, p->a_str); ! 1027: ret = 1; ! 1028: } ! 1029: } ! 1030: ! 1031: return ret; ! 1032: } ! 1033: ! 1034: /* ! 1035: * Load the resultant objects and the rest. ! 1036: */ ! 1037: int ! 1038: load() ! 1039: { ! 1040: if (cflag) ! 1041: return 0; ! 1042: ! 1043: if (load_out != NULL) ! 1044: output = load_out; ! 1045: else ! 1046: output = DEF_OUT; ! 1047: ! 1048: if (jerq) ! 1049: add_arg(JERQ_LIB, files); ! 1050: else ! 1051: add_arg(DEF_LIB, files); ! 1052: ! 1053: return execute(&load_eargs); ! 1054: } ! 1055: ! 1056: /* ! 1057: * Find out if there are more than one '.c' and at least one file. ! 1058: */ ! 1059: int ! 1060: scan_files() ! 1061: { ! 1062: register arg *p; ! 1063: register int i; ! 1064: ! 1065: p = files->a_head; ! 1066: ! 1067: if (p == NULL) ! 1068: { ! 1069: fprintf(stderr, "%s: no files specified\n", my_name); ! 1070: return 1; ! 1071: } ! 1072: ! 1073: i = 0; ! 1074: ! 1075: do ! 1076: { ! 1077: if (suffix(p->a_str) == 'c') ! 1078: { ! 1079: if (i) ! 1080: { ! 1081: multi_cfile = 1; ! 1082: break; ! 1083: } ! 1084: ! 1085: i = 1; ! 1086: } ! 1087: } ! 1088: while ((p = p->a_next) != NULL); ! 1089: ! 1090: return 0; ! 1091: } ! 1092: ! 1093: /* ! 1094: * User action routine. ! 1095: */ ! 1096: int ! 1097: do_it() ! 1098: { ! 1099: return scan_files() || compile() || load(); ! 1100: } ! 1101: ! 1102: /* ! 1103: * Compiler front end. ! 1104: */ ! 1105: int ! 1106: main(argc, argv) ! 1107: int argc; ! 1108: char *argv[]; ! 1109: { ! 1110: init(argv[0]); ! 1111: uinit(); ! 1112: quit(options(argc - 1, &argv[1]) || do_it()); ! 1113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.