|
|
1.1 ! root 1: static char sccsid[] = "@(#)cc.c 4.7 7/1/83"; ! 2: /* ! 3: * cc - front end for C compiler ! 4: */ ! 5: #include <sys/param.h> ! 6: #include <stdio.h> ! 7: #include <ctype.h> ! 8: #include <signal.h> ! 9: #include <sys/dir.h> ! 10: ! 11: char *cpp = "/lib/cpp"; ! 12: char *ccom = "/lib/ccom"; ! 13: char *c2 = "/lib/c2"; ! 14: char *as = "/bin/as"; ! 15: char *ld = "/bin/ld"; ! 16: char *crt0 = "/lib/crt0.o"; ! 17: ! 18: char tmp0[30]; /* big enough for /tmp/ctm%05.5d */ ! 19: char *tmp1, *tmp2, *tmp3, *tmp4, *tmp5; ! 20: char *outfile; ! 21: char *savestr(), *strspl(), *setsuf(); ! 22: int idexit(); ! 23: char **av, **clist, **llist, **plist; ! 24: int cflag, eflag, oflag, pflag, sflag, wflag, Rflag, exflag, proflag; ! 25: int gflag, Gflag; ! 26: char *dflag; ! 27: int exfail; ! 28: char *chpass; ! 29: char *npassname; ! 30: ! 31: int nc, nl, np, nxo, na; ! 32: ! 33: #define cunlink(s) if (s) unlink(s) ! 34: ! 35: main(argc, argv) ! 36: char **argv; ! 37: { ! 38: char *t; ! 39: char *assource; ! 40: int i, j, c; ! 41: ! 42: /* ld currently adds upto 5 args; 10 is room to spare */ ! 43: av = (char **)calloc(argc+10, sizeof (char **)); ! 44: clist = (char **)calloc(argc, sizeof (char **)); ! 45: llist = (char **)calloc(argc, sizeof (char **)); ! 46: plist = (char **)calloc(argc, sizeof (char **)); ! 47: for (i = 1; i < argc; i++) { ! 48: if (*argv[i] == '-') switch (argv[i][1]) { ! 49: ! 50: case 'S': ! 51: sflag++; ! 52: cflag++; ! 53: continue; ! 54: case 'o': ! 55: if (++i < argc) { ! 56: outfile = argv[i]; ! 57: switch (getsuf(outfile)) { ! 58: ! 59: case 'c': ! 60: case 'o': ! 61: error("-o would overwrite %s", ! 62: outfile); ! 63: exit(8); ! 64: } ! 65: } ! 66: continue; ! 67: case 'R': ! 68: Rflag++; ! 69: continue; ! 70: case 'O': ! 71: oflag++; ! 72: continue; ! 73: case 'p': ! 74: proflag++; ! 75: crt0 = "/lib/mcrt0.o"; ! 76: if (argv[i][2] == 'g') ! 77: crt0 = "/usr/lib/gcrt0.o"; ! 78: continue; ! 79: case 'g': ! 80: if (argv[i][2] == 'o') { ! 81: Gflag++; /* old format for -go */ ! 82: } else { ! 83: gflag++; /* new format for -g */ ! 84: } ! 85: continue; ! 86: case 'w': ! 87: wflag++; ! 88: continue; ! 89: case 'E': ! 90: exflag++; ! 91: case 'P': ! 92: pflag++; ! 93: if (argv[i][1]=='P') ! 94: fprintf(stderr, ! 95: "cc: warning: -P option obsolete; you should use -E instead\n"); ! 96: plist[np++] = argv[i]; ! 97: case 'c': ! 98: cflag++; ! 99: continue; ! 100: case 'D': ! 101: case 'I': ! 102: case 'U': ! 103: case 'C': ! 104: plist[np++] = argv[i]; ! 105: continue; ! 106: case 't': ! 107: if (chpass) ! 108: error("-t overwrites earlier option", 0); ! 109: chpass = argv[i]+2; ! 110: if (chpass[0]==0) ! 111: chpass = "012p"; ! 112: continue; ! 113: case 'B': ! 114: if (npassname) ! 115: error("-B overwrites earlier option", 0); ! 116: npassname = argv[i]+2; ! 117: if (npassname[0]==0) ! 118: npassname = "/usr/c/o"; ! 119: continue; ! 120: case 'd': ! 121: dflag = argv[i]; ! 122: continue; ! 123: } ! 124: t = argv[i]; ! 125: c = getsuf(t); ! 126: if (c=='c' || c=='s' || exflag) { ! 127: clist[nc++] = t; ! 128: t = setsuf(t, 'o'); ! 129: } ! 130: if (nodup(llist, t)) { ! 131: llist[nl++] = t; ! 132: if (getsuf(t)=='o') ! 133: nxo++; ! 134: } ! 135: } ! 136: if (gflag || Gflag) { ! 137: if (oflag) ! 138: fprintf(stderr, "cc: warning: -g disables -O\n"); ! 139: oflag = 0; ! 140: } ! 141: if (npassname && chpass ==0) ! 142: chpass = "012p"; ! 143: if (chpass && npassname==0) ! 144: npassname = "/usr/new"; ! 145: if (chpass) ! 146: for (t=chpass; *t; t++) { ! 147: switch (*t) { ! 148: ! 149: case '0': ! 150: ccom = strspl(npassname, "ccom"); ! 151: continue; ! 152: case '2': ! 153: c2 = strspl(npassname, "c2"); ! 154: continue; ! 155: case 'p': ! 156: cpp = strspl(npassname, "cpp"); ! 157: continue; ! 158: } ! 159: } ! 160: if (nc==0) ! 161: goto nocom; ! 162: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 163: signal(SIGINT, idexit); ! 164: if (signal(SIGTERM, SIG_IGN) != SIG_IGN) ! 165: signal(SIGTERM, idexit); ! 166: if (pflag==0) ! 167: sprintf(tmp0, "/tmp/ctm%05.5d", getpid()); ! 168: tmp1 = strspl(tmp0, "1"); ! 169: tmp2 = strspl(tmp0, "2"); ! 170: tmp3 = strspl(tmp0, "3"); ! 171: if (pflag==0) ! 172: tmp4 = strspl(tmp0, "4"); ! 173: if (oflag) ! 174: tmp5 = strspl(tmp0, "5"); ! 175: for (i=0; i<nc; i++) { ! 176: if (nc > 1) { ! 177: printf("%s:\n", clist[i]); ! 178: fflush(stdout); ! 179: } ! 180: if (getsuf(clist[i]) == 's') { ! 181: assource = clist[i]; ! 182: goto assemble; ! 183: } else ! 184: assource = tmp3; ! 185: if (pflag) ! 186: tmp4 = setsuf(clist[i], 'i'); ! 187: av[0] = "cpp"; av[1] = clist[i]; av[2] = exflag ? "-" : tmp4; ! 188: na = 3; ! 189: for (j = 0; j < np; j++) ! 190: av[na++] = plist[j]; ! 191: av[na++] = 0; ! 192: if (callsys(cpp, av)) { ! 193: exfail++; ! 194: eflag++; ! 195: } ! 196: if (pflag || exfail) { ! 197: cflag++; ! 198: continue; ! 199: } ! 200: if (sflag) ! 201: assource = tmp3 = setsuf(clist[i], 's'); ! 202: av[0] = "ccom"; av[1] = tmp4; av[2] = oflag?tmp5:tmp3; na = 3; ! 203: if (proflag) ! 204: av[na++] = "-XP"; ! 205: if (gflag) { ! 206: av[na++] = "-Xg"; ! 207: } else if (Gflag) { ! 208: av[na++] = "-XG"; ! 209: } ! 210: if (wflag) ! 211: av[na++] = "-w"; ! 212: av[na] = 0; ! 213: if (callsys(ccom, av)) { ! 214: cflag++; ! 215: eflag++; ! 216: continue; ! 217: } ! 218: if (oflag) { ! 219: av[0] = "c2"; av[1] = tmp5; av[2] = tmp3; av[3] = 0; ! 220: if (callsys(c2, av)) { ! 221: unlink(tmp3); ! 222: tmp3 = assource = tmp5; ! 223: } else ! 224: unlink(tmp5); ! 225: } ! 226: if (sflag) ! 227: continue; ! 228: assemble: ! 229: cunlink(tmp1); cunlink(tmp2); cunlink(tmp4); ! 230: av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o'); ! 231: na = 3; ! 232: if (Rflag) ! 233: av[na++] = "-R"; ! 234: if (dflag) ! 235: av[na++] = dflag; ! 236: av[na++] = assource; ! 237: av[na] = 0; ! 238: if (callsys(as, av) > 1) { ! 239: cflag++; ! 240: eflag++; ! 241: continue; ! 242: } ! 243: } ! 244: nocom: ! 245: if (cflag==0 && nl!=0) { ! 246: i = 0; ! 247: av[0] = "ld"; av[1] = "-X"; av[2] = crt0; na = 3; ! 248: if (outfile) { ! 249: av[na++] = "-o"; ! 250: av[na++] = outfile; ! 251: } ! 252: while (i < nl) ! 253: av[na++] = llist[i++]; ! 254: if (gflag || Gflag) ! 255: av[na++] = "-lg"; ! 256: if (proflag) ! 257: av[na++] = "-lc_p"; ! 258: else ! 259: av[na++] = "-lc"; ! 260: av[na++] = 0; ! 261: eflag |= callsys(ld, av); ! 262: if (nc==1 && nxo==1 && eflag==0) ! 263: unlink(setsuf(clist[0], 'o')); ! 264: } ! 265: dexit(); ! 266: } ! 267: ! 268: idexit() ! 269: { ! 270: ! 271: eflag = 100; ! 272: dexit(); ! 273: } ! 274: ! 275: dexit() ! 276: { ! 277: ! 278: if (!pflag) { ! 279: cunlink(tmp1); ! 280: cunlink(tmp2); ! 281: if (sflag==0) ! 282: cunlink(tmp3); ! 283: cunlink(tmp4); ! 284: cunlink(tmp5); ! 285: } ! 286: exit(eflag); ! 287: } ! 288: ! 289: error(s, x) ! 290: char *s, *x; ! 291: { ! 292: FILE *diag = exflag ? stderr : stdout; ! 293: ! 294: fprintf(diag, "cc: "); ! 295: fprintf(diag, s, x); ! 296: putc('\n', diag); ! 297: exfail++; ! 298: cflag++; ! 299: eflag++; ! 300: } ! 301: ! 302: getsuf(as) ! 303: char as[]; ! 304: { ! 305: register int c; ! 306: register char *s; ! 307: register int t; ! 308: ! 309: s = as; ! 310: c = 0; ! 311: while (t = *s++) ! 312: if (t=='/') ! 313: c = 0; ! 314: else ! 315: c++; ! 316: s -= 3; ! 317: if (c <= MAXNAMLEN && c > 2 && *s++ == '.') ! 318: return (*s); ! 319: return (0); ! 320: } ! 321: ! 322: char * ! 323: setsuf(as, ch) ! 324: char *as; ! 325: { ! 326: register char *s, *s1; ! 327: ! 328: s = s1 = savestr(as); ! 329: while (*s) ! 330: if (*s++ == '/') ! 331: s1 = s; ! 332: s[-1] = ch; ! 333: return (s1); ! 334: } ! 335: ! 336: callsys(f, v) ! 337: char *f, **v; ! 338: { ! 339: int t, status; ! 340: ! 341: t = vfork(); ! 342: if (t == -1) { ! 343: printf("No more processes\n"); ! 344: return (100); ! 345: } ! 346: if (t == 0) { ! 347: execv(f, v); ! 348: printf("Can't find %s\n", f); ! 349: fflush(stdout); ! 350: _exit(100); ! 351: } ! 352: while (t != wait(&status)) ! 353: ; ! 354: if ((t=(status&0377)) != 0 && t!=14) { ! 355: if (t!=2) { ! 356: printf("Fatal error in %s\n", f); ! 357: eflag = 8; ! 358: } ! 359: dexit(); ! 360: } ! 361: return ((status>>8) & 0377); ! 362: } ! 363: ! 364: nodup(l, os) ! 365: char **l, *os; ! 366: { ! 367: register char *t, *s; ! 368: register int c; ! 369: ! 370: s = os; ! 371: if (getsuf(s) != 'o') ! 372: return (1); ! 373: while (t = *l++) { ! 374: while (c = *s++) ! 375: if (c != *t++) ! 376: break; ! 377: if (*t==0 && c==0) ! 378: return (0); ! 379: s = os; ! 380: } ! 381: return (1); ! 382: } ! 383: ! 384: #define NSAVETAB 1024 ! 385: char *savetab; ! 386: int saveleft; ! 387: ! 388: char * ! 389: savestr(cp) ! 390: register char *cp; ! 391: { ! 392: register int len; ! 393: ! 394: len = strlen(cp) + 1; ! 395: if (len > saveleft) { ! 396: saveleft = NSAVETAB; ! 397: if (len > saveleft) ! 398: saveleft = len; ! 399: savetab = (char *)malloc(saveleft); ! 400: if (savetab == 0) { ! 401: fprintf(stderr, "ran out of memory (savestr)\n"); ! 402: exit(1); ! 403: } ! 404: } ! 405: strncpy(savetab, cp, len); ! 406: cp = savetab; ! 407: savetab += len; ! 408: saveleft -= len; ! 409: return (cp); ! 410: } ! 411: ! 412: char * ! 413: strspl(left, right) ! 414: char *left, *right; ! 415: { ! 416: char buf[BUFSIZ]; ! 417: ! 418: strcpy(buf, left); ! 419: strcat(buf, right); ! 420: return (savestr(buf)); ! 421: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.