|
|
1.1 ! root 1: # ! 2: # include <stdio.h> ! 3: # include <ctype.h> ! 4: # include <signal.h> ! 5: /* C command */ ! 6: ! 7: # define SBSIZE 10000 ! 8: # define MAXINC 10 ! 9: # define MAXFIL 100 ! 10: # define MAXLIB 100 ! 11: # define MAXOPT 100 ! 12: char tmp0[30]; ! 13: char *tmp1; ! 14: char *tmp2; ! 15: char *tmp3; ! 16: char *tmp4; ! 17: char *tmp5; ! 18: char *outfile; ! 19: char *copy(),*setsuf(); ! 20: # define CHSPACE 1000 ! 21: char ts[CHSPACE+50]; ! 22: char *tsa = ts; ! 23: char *tsp = ts; ! 24: char *av[50]; ! 25: char *clist[MAXFIL]; ! 26: char *llist[MAXLIB]; ! 27: char *alist[20]; ! 28: int Wflag; ! 29: int dflag; ! 30: int pflag; ! 31: int sflag; ! 32: int cflag; ! 33: int eflag; ! 34: int gflag; ! 35: int exflag; ! 36: int oflag; ! 37: int proflag; ! 38: int noflflag; ! 39: int exfail; ! 40: char *chpass ; ! 41: char *npassname ; ! 42: char pass0[40] = "/lib/ccom"; ! 43: char pass2[20] = "/lib/c2"; ! 44: char passp[20] = "/lib/cpp"; ! 45: char *pref = "/lib/crt0.o"; ! 46: ! 47: main(argc, argv) ! 48: char *argv[]; { ! 49: char *t; ! 50: char *savetsp; ! 51: char *assource; ! 52: char **pv, *ptemp[MAXOPT], **pvt; ! 53: int nc, nl, i, j, c, f20, nxo, na; ! 54: int idexit(); ! 55: ! 56: i = nc = nl = f20 = nxo = 0; ! 57: pv = ptemp; ! 58: while(++i < argc) { ! 59: if(*argv[i] == '-') switch (argv[i][1]) { ! 60: default: ! 61: goto passa; ! 62: case 'S': ! 63: sflag++; ! 64: cflag++; ! 65: break; ! 66: case 'o': ! 67: if (++i < argc) { ! 68: char t; ! 69: outfile = argv[i]; ! 70: if ((t=getsuf(outfile))=='c'||t=='o') { ! 71: error("Would overwrite %s", outfile); ! 72: exit(8); ! 73: } ! 74: } ! 75: break; ! 76: case 'O': ! 77: oflag++; ! 78: break; ! 79: case 'p': ! 80: proflag++; ! 81: break; ! 82: case 'g': ! 83: gflag++; ! 84: break; ! 85: case 'W': /* deprecated */ ! 86: case 'w': ! 87: Wflag++; ! 88: break; ! 89: case 'E': ! 90: exflag++; ! 91: case 'P': ! 92: pflag++; ! 93: if (argv[i][1]=='P') ! 94: fprintf(stderr, "(Warning): -P option obsolete\n"); ! 95: *pv++ = argv[i]; ! 96: case 'c': ! 97: cflag++; ! 98: break; ! 99: ! 100: case 'f': ! 101: noflflag++; ! 102: if (npassname || chpass) ! 103: error("-f overwrites earlier option",0); ! 104: npassname = "/lib/f"; ! 105: chpass = "12"; ! 106: break; ! 107: ! 108: case '2': ! 109: if(argv[i][2] == '\0') ! 110: pref = "/lib/crt2.o"; ! 111: else { ! 112: pref = "/lib/crt20.o"; ! 113: f20 = 1; ! 114: } ! 115: break; ! 116: case 'D': ! 117: case 'I': ! 118: case 'U': ! 119: case 'C': ! 120: *pv++ = argv[i]; ! 121: if (pv >= ptemp+MAXOPT) ! 122: { ! 123: error("Too many DIUC options", 0); ! 124: --pv; ! 125: } ! 126: break; ! 127: case 't': ! 128: if (chpass) ! 129: error("-t overwrites earlier option",0); ! 130: chpass = argv[i]+2; ! 131: if (chpass[0]==0) ! 132: chpass = "012p"; ! 133: break; ! 134: ! 135: case 'B': ! 136: if (npassname) ! 137: error("-B overwrites earlier option", 0); ! 138: npassname = argv[i]+2; ! 139: if (npassname[0]==0) ! 140: npassname = "/usr/c/o"; ! 141: break; ! 142: ! 143: case 'd': ! 144: dflag++; ! 145: strcpyn(alist, argv[i], 19); ! 146: break; ! 147: } else { ! 148: passa: ! 149: t = argv[i]; ! 150: if((c=getsuf(t))=='c' || c=='s'|| exflag) { ! 151: clist[nc++] = t; ! 152: if (nc>=MAXFIL) ! 153: { ! 154: error("Too many source files",0); ! 155: exit(1); ! 156: } ! 157: t = setsuf(t, 'o'); ! 158: } ! 159: if (nodup(llist, t)) { ! 160: llist[nl++] = t; ! 161: if (nl >= MAXLIB) ! 162: { ! 163: error("Too many object/library files",0); ! 164: exit(1); ! 165: } ! 166: if (getsuf(t)=='o') ! 167: nxo++; ! 168: } ! 169: } ! 170: } ! 171: if (gflag) oflag = 0; ! 172: if (npassname && chpass ==0) ! 173: chpass = "012p"; ! 174: if (chpass && npassname==0) ! 175: npassname = "/usr/c/"; ! 176: if (chpass) ! 177: for (t=chpass; *t; t++) ! 178: { ! 179: switch (*t) ! 180: { ! 181: case '0': ! 182: strcpy (pass0, npassname); ! 183: strcat (pass0, "ccom"); ! 184: continue; ! 185: case '2': ! 186: strcpy (pass2, npassname); ! 187: strcat (pass2, "c2"); ! 188: continue; ! 189: case 'p': ! 190: strcpy (passp, npassname); ! 191: strcat (passp, "cpp"); ! 192: continue; ! 193: } ! 194: } ! 195: if (noflflag) ! 196: pref = proflag ? "/lib/fmcrt0.o" : "/lib/fcrt0.o"; ! 197: else if (proflag) ! 198: pref = "/lib/mcrt0.o"; ! 199: if(nc==0) ! 200: goto nocom; ! 201: if (pflag==0) { ! 202: FILE *c; ! 203: sprintf(tmp0,"/tmp/ctm%05.5da",getpid()); ! 204: while((c=fopen(tmp0, "r")) != NULL) { ! 205: fclose(c); ! 206: tmp0[9]++; ! 207: } ! 208: while((creat(tmp0, 0400))<0) ! 209: tmp0[9]++; ! 210: } ! 211: if (signal(SIGINT, SIG_IGN) != SIG_IGN) /* interrupt */ ! 212: signal(SIGINT, idexit); ! 213: if (signal(SIGTERM, SIG_IGN) != SIG_IGN) /* terminate */ ! 214: signal(SIGTERM, idexit); ! 215: (tmp1 = copy(tmp0))[13] = '1'; ! 216: (tmp2 = copy(tmp0))[13] = '2'; ! 217: (tmp3 = copy(tmp0))[13] = '3'; ! 218: if (oflag) ! 219: (tmp5 = copy(tmp0))[13] = '5'; ! 220: if (pflag==0) ! 221: (tmp4 = copy(tmp0))[13] = '4'; ! 222: pvt = pv; ! 223: for (i=0; i<nc; i++) { ! 224: if (nc>1) { ! 225: printf("%s:\n", clist[i]); ! 226: fflush(stdout); ! 227: } ! 228: if (getsuf(clist[i])=='s') { ! 229: assource = clist[i]; ! 230: goto assemble; ! 231: } else ! 232: assource = tmp3; ! 233: if (pflag) ! 234: tmp4 = setsuf(clist[i], 'i'); ! 235: savetsp = tsp; ! 236: av[0] = "cpp"; ! 237: av[1] = clist[i]; ! 238: av[2] = exflag ? "-" : tmp4; ! 239: na = 3; ! 240: for(pv=ptemp; pv <pvt; pv++) ! 241: av[na++] = *pv; ! 242: av[na++]=0; ! 243: if (callsys(passp, av)) ! 244: {exfail++; eflag++;} ! 245: av[1] =tmp4; ! 246: tsp = savetsp; ! 247: av[0]= "ccom"; ! 248: if (pflag || exfail) ! 249: { ! 250: cflag++; ! 251: continue; ! 252: } ! 253: if(sflag) ! 254: assource = tmp3 = setsuf(clist[i], 's'); ! 255: av[2] = tmp3; ! 256: if(oflag) ! 257: av[2] = tmp5; ! 258: if (proflag) { ! 259: av[3] = "-XP"; ! 260: av[4] = 0; ! 261: } else ! 262: av[3] = 0; ! 263: if (gflag) { ! 264: int i; ! 265: ! 266: i = av[3] ? 4 : 3; ! 267: av[i++] = "-Xg"; ! 268: av[i] = 0; ! 269: } ! 270: if (Wflag) { ! 271: int i; ! 272: ! 273: for (i = 3; i < 10 && av[i] != 0; i++) ! 274: ; ! 275: av[i] = "-W"; ! 276: av[++i] = 0; ! 277: } ! 278: ! 279: if (callsys(pass0, av)) { ! 280: cflag++; ! 281: eflag++; ! 282: continue; ! 283: } ! 284: if (oflag) { ! 285: av[0] = "c2"; ! 286: av[1] = tmp5; ! 287: av[2] = tmp3; ! 288: av[3] = 0; ! 289: if (callsys(pass2, av)) { ! 290: unlink(tmp3); ! 291: tmp3 = assource = tmp5; ! 292: } else ! 293: unlink(tmp5); ! 294: } ! 295: if (sflag) ! 296: continue; ! 297: assemble: ! 298: av[0] = "as"; ! 299: av[1] = "-o"; ! 300: av[2] = setsuf(clist[i], 'o'); ! 301: av[3] = assource; ! 302: if (dflag) { ! 303: av[4] = alist; ! 304: av[5] = 0; ! 305: } else ! 306: av[4] = 0; ! 307: cunlink(tmp1); ! 308: cunlink(tmp2); ! 309: cunlink(tmp4); ! 310: if (callsys("/bin/as", av) > 1) { ! 311: cflag++; ! 312: eflag++; ! 313: continue; ! 314: } ! 315: } ! 316: nocom: ! 317: if (cflag==0 && nl!=0) { ! 318: i = 0; ! 319: av[0] = "ld"; ! 320: av[1] = "-X"; ! 321: av[2] = pref; ! 322: j = 3; ! 323: if (outfile) { ! 324: av[j++] = "-o"; ! 325: av[j++] = outfile; ! 326: } ! 327: while(i<nl) ! 328: av[j++] = llist[i++]; ! 329: if (gflag) ! 330: av[j++] = "-lg"; ! 331: if(f20) ! 332: av[j++] = "-l2"; ! 333: else { ! 334: av[j++] = "/lib/libc.a"; ! 335: av[j++] = "-l"; ! 336: } ! 337: av[j++] = 0; ! 338: eflag |= callsys("/bin/ld", av); ! 339: if (nc==1 && nxo==1 && eflag==0) ! 340: cunlink(setsuf(clist[0], 'o')); ! 341: } ! 342: dexit(); ! 343: } ! 344: ! 345: idexit() ! 346: { ! 347: eflag = 100; ! 348: dexit(); ! 349: } ! 350: ! 351: dexit() ! 352: { ! 353: if (!pflag) { ! 354: cunlink(tmp1); ! 355: cunlink(tmp2); ! 356: if (sflag==0) ! 357: cunlink(tmp3); ! 358: cunlink(tmp4); ! 359: cunlink(tmp5); ! 360: cunlink(tmp0); ! 361: } ! 362: exit(eflag); ! 363: } ! 364: ! 365: error(s, x) ! 366: { ! 367: fprintf(exflag?stderr:stdout , s, x); ! 368: putc('\n', exflag? stderr : stdout); ! 369: exfail++; ! 370: cflag++; ! 371: eflag++; ! 372: } ! 373: ! 374: ! 375: ! 376: ! 377: getsuf(as) ! 378: char as[]; ! 379: { ! 380: register int c; ! 381: register char *s; ! 382: register int t; ! 383: ! 384: s = as; ! 385: c = 0; ! 386: while(t = *s++) ! 387: if (t=='/') ! 388: c = 0; ! 389: else ! 390: c++; ! 391: s -= 3; ! 392: if (c<=14 && c>2 && *s++=='.') ! 393: return(*s); ! 394: return(0); ! 395: } ! 396: ! 397: char * ! 398: setsuf(as, ch) ! 399: char as[]; ! 400: { ! 401: register char *s, *s1; ! 402: ! 403: s = s1 = copy(as); ! 404: while(*s) ! 405: if (*s++ == '/') ! 406: s1 = s; ! 407: s[-1] = ch; ! 408: return(s1); ! 409: } ! 410: ! 411: callsys(f, v) ! 412: char f[], *v[]; { ! 413: int t, status; ! 414: ! 415: if ((t=vfork())==0) { ! 416: execv(f, v); ! 417: printf("Can't find %s\n", f); ! 418: fflush(stdout); ! 419: _exit(100); ! 420: } else ! 421: if (t == -1) { ! 422: printf("Try again\n"); ! 423: return(100); ! 424: } ! 425: while(t!=wait(&status)); ! 426: if ((t=(status&0377)) != 0 && t!=14) { ! 427: if (t!=2) /* interrupt */ ! 428: { ! 429: printf("Fatal error in %s\n", f); ! 430: eflag = 8; ! 431: } ! 432: dexit(); ! 433: } ! 434: return((status>>8) & 0377); ! 435: } ! 436: ! 437: char * ! 438: copy(as) ! 439: char as[]; ! 440: { ! 441: register char *otsp, *s; ! 442: int i; ! 443: ! 444: otsp = tsp; ! 445: s = as; ! 446: while(*tsp++ = *s++); ! 447: if (tsp >tsa+CHSPACE) ! 448: { ! 449: tsp = tsa = i = calloc(CHSPACE+50,1); ! 450: if (i== -1){ ! 451: error("no space for file names"); ! 452: dexit(8); ! 453: } ! 454: } ! 455: return(otsp); ! 456: } ! 457: ! 458: nodup(l, os) ! 459: char **l, *os; ! 460: { ! 461: register char *t, *s; ! 462: register int c; ! 463: ! 464: s = os; ! 465: if (getsuf(s) != 'o') ! 466: return(1); ! 467: while(t = *l++) { ! 468: while(c = *s++) ! 469: if (c != *t++) ! 470: break; ! 471: if (*t=='\0' && c=='\0') ! 472: return(0); ! 473: s = os; ! 474: } ! 475: return(1); ! 476: } ! 477: ! 478: cunlink(f) ! 479: char *f; ! 480: { ! 481: if (f==0) ! 482: return(0); ! 483: return(unlink(f)); ! 484: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.