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