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