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