|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <ctype.h> ! 3: # include <signal.h> ! 4: ! 5: # include "11cc.h" /* god: has all the local pathnames */ ! 6: ! 7: /* 11cc command */ ! 8: ! 9: # define MAXINC 10 ! 10: # define MAXFIL 100 ! 11: # define MAXLIB 100 ! 12: # define MAXOPT 100 ! 13: char *tmp0; ! 14: char *tmp1; ! 15: char *tmp2; ! 16: char *tmp3; ! 17: char *tmp4; ! 18: char *tmp5; ! 19: char *tmp6, *tmp7; /* mjm */ ! 20: char *outfile; ! 21: char *av[50]; ! 22: char *clist[MAXFIL]; ! 23: char *llist[MAXLIB]; ! 24: int pflag; ! 25: int sflag; ! 26: int cflag; ! 27: int eflag; ! 28: int exflag; ! 29: int oflag; ! 30: int Fflag; /* mjm: RH fpp */ ! 31: int vflag; /* mjm: verbose */ ! 32: int proflag; ! 33: int noflflag; ! 34: int zflag; /* request zero-extension on all chars */ ! 35: char *chpass ; ! 36: char *npassname ; ! 37: char pass0[50] = LIBPATH(11c0); /*god*/ ! 38: char pass1[50] = LIBPATH(11c1); /*god*/ ! 39: char pass2[50] = LIBPATH(11c2); /*god*/ ! 40: char passp[50] = "/lib/cpp"; /*god*/ ! 41: char passf[50] = LIBPATH(fpp); /*mjm*/ ! 42: char *pref = LIBPATH(11crt0.o); /*god*/ ! 43: char *copy(); ! 44: char *setsuf(); ! 45: char *strcat(); ! 46: char *strcpy(); ! 47: char *stralloc(); ! 48: extern int optind; ! 49: extern int opterr; ! 50: extern char *optarg; ! 51: extern int optopt; ! 52: ! 53: main(argc, argv) ! 54: char *argv[]; ! 55: { ! 56: char *rhopt; /* mjm */ ! 57: char *t; ! 58: char *assource; ! 59: char **pv, *ptemp[MAXOPT], **pvt; ! 60: int nc, nl, i, j, c, nxo, na; ! 61: int idexit(); ! 62: ! 63: opterr = 0; ! 64: i = nc = nl = nxo = 0; ! 65: setbuf(stdout, (char *)NULL); ! 66: pv = ptemp; ! 67: while (optind<argc) ! 68: switch (c = getopt(argc, argv, "So:OpEPcfL:l:D:I:U:C:t:B:zvF")) { ! 69: case 'S': ! 70: sflag++; ! 71: cflag++; ! 72: continue; ! 73: ! 74: case 'o': ! 75: outfile = optarg; ! 76: if ((c=getsuf(outfile))=='c'||c=='o') { ! 77: error("Would overwrite %s", outfile); ! 78: exit(8); ! 79: } ! 80: continue; ! 81: ! 82: case 'O': ! 83: oflag++; ! 84: continue; ! 85: ! 86: case 'p': ! 87: error("profiling not supported", (char *)NULL); /*god*/ ! 88: exit(-1); /*god*/ ! 89: /*god*/ /*proflag++; ! 90: continue;*/ /*god*/ ! 91: ! 92: case 'E': ! 93: exflag++; ! 94: cflag++; ! 95: pflag++; ! 96: *pv++ = "-E"; ! 97: continue; ! 98: ! 99: case 'P': ! 100: pflag++; ! 101: *pv++ = "-P"; ! 102: case 'c': ! 103: cflag++; ! 104: continue; ! 105: ! 106: case 'f': ! 107: /*god*/ error("floating point interpreter not supported",(char *)NULL); ! 108: error("use -F to invoke floating point preprocessor", ! 109: (char *)NULL); /*god*/ ! 110: exit(-1); /*god*/ ! 111: /*god*/ /*noflflag++; ! 112: if (npassname || chpass) ! 113: error("-f overwrites earlier option", (char *)NULL); ! 114: npassname = "/lib/f"; ! 115: chpass = "1"; ! 116: continue;*/ /*god*/ ! 117: ! 118: case 'L': ! 119: t = stralloc(strlen(optarg)+2); ! 120: t[0] = '-'; ! 121: t[1] = 'L'; ! 122: t[2] = '\0'; ! 123: strcat(t, optarg); ! 124: llist[nl++] = t; ! 125: break; ! 126: ! 127: case 'l': ! 128: t = stralloc(strlen(optarg)+2); ! 129: t[0] = '-'; ! 130: t[1] = 'l'; ! 131: t[2] = '\0'; ! 132: strcat(t, optarg); ! 133: llist[nl++] = t; ! 134: break; ! 135: ! 136: case 'D': ! 137: case 'I': ! 138: case 'U': ! 139: case 'C': ! 140: *pv = stralloc(strlen(optarg)+2); ! 141: if (pv >= ptemp+MAXOPT) { ! 142: error("Too many DIUC options", (char *)NULL); ! 143: dexit(); ! 144: } ! 145: (*pv)[0] = '-'; ! 146: (*pv)[1] = c; ! 147: (*pv)[2] = '\0'; ! 148: strcat(*pv, optarg); ! 149: pv++; ! 150: break; ! 151: ! 152: case 't': ! 153: if (chpass) ! 154: error("-t overwrites earlier option", (char *)NULL); ! 155: chpass = optarg; ! 156: if (chpass[0]==0) ! 157: chpass = "012pf"; /*god: allow select fpp pass*/ ! 158: break; ! 159: ! 160: case 'B': ! 161: if (npassname) ! 162: error("-B overwrites earlier option", (char *)NULL); ! 163: npassname = optarg; ! 164: if (npassname[0]==0) ! 165: npassname = LIBPATH(11); /*god*/ ! 166: break; ! 167: ! 168: case '?': ! 169: t = stralloc(3); ! 170: t[0] = '-'; ! 171: t[1] = optopt; ! 172: t[2] = '\0'; ! 173: llist[nl++] = t; ! 174: break; ! 175: ! 176: case 'z': ! 177: zflag++; ! 178: break; ! 179: ! 180: case 'v': /* mjm: callsys print */ ! 181: vflag++; ! 182: break; ! 183: ! 184: case 'F': /* mjm: RH fpp */ ! 185: Fflag++; ! 186: if( (optind < argc)/*god*/ && (argv[optind][1] == 'F') ) ! 187: rhopt = argv[optind]; ! 188: else if(argv[optind-1][1] == 'F') ! 189: rhopt = argv[optind-1]; ! 190: for(t = rhopt+2; *t != '\0'; t++) /* skip rest after -F */ ! 191: getopt(argc, argv, "qunl"); ! 192: break; ! 193: ! 194: case EOF: ! 195: t = argv[optind]; ! 196: optind++; ! 197: if((c=getsuf(t))=='c' || c=='s'|| exflag) { ! 198: clist[nc++] = t; ! 199: if (nc>=MAXFIL) { ! 200: error("Too many source files", (char *)NULL); ! 201: exit(1); ! 202: } ! 203: t = setsuf(t, 'o'); ! 204: } ! 205: if (nodup(llist, t)) { ! 206: llist[nl++] = t; ! 207: if (nl >= MAXLIB) { ! 208: error("Too many object/library files", (char *)NULL); ! 209: exit(1); ! 210: } ! 211: if (getsuf(t)=='o') ! 212: nxo++; ! 213: } ! 214: } ! 215: if (npassname && chpass ==0) ! 216: chpass = "012pf"; /*god: allow select fpp pass*/ ! 217: if (chpass && npassname==0) ! 218: npassname = LIBPATH(11); /*god*/ ! 219: if (chpass) ! 220: for (t=chpass; *t; t++) { ! 221: switch (*t) { ! 222: case '0': ! 223: strcpy (pass0, npassname); ! 224: strcat (pass0, "c0"); ! 225: continue; ! 226: case '1': ! 227: strcpy (pass1, npassname); ! 228: strcat (pass1, "c1"); ! 229: continue; ! 230: case '2': ! 231: strcpy (pass2, npassname); ! 232: strcat (pass2, "c2"); ! 233: continue; ! 234: case 'p': ! 235: strcpy (passp, npassname); ! 236: strcat (passp, "cpp"); ! 237: continue; ! 238: case 'f': /*god: include fpp in here */ ! 239: strcpy (passf, npassname); ! 240: strcat (passf, "fpp"); ! 241: } ! 242: } ! 243: /*god*/ /*if (noflflag) ! 244: pref = proflag ? "/lib/fmcrt0.o" : "/lib/fcrt0.o"; ! 245: else if (proflag) ! 246: pref = "/lib/mcrt0.o";*/ /*god*/ ! 247: if(nc==0) ! 248: goto nocom; ! 249: if (pflag==0 || Fflag) { /* mjm: added Fflag */ ! 250: tmp0 = copy("/tmp/ctm0a"); ! 251: while (access(tmp0, 0)==0) ! 252: tmp0[9]++; ! 253: while((creat(tmp0, 0400))<0) { ! 254: if (tmp0[9]=='z') { ! 255: error("11cc: cannot create temp", (char *)NULL); ! 256: exit(1); ! 257: } ! 258: tmp0[9]++; ! 259: } ! 260: } ! 261: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 262: signal(SIGINT, idexit); ! 263: if (signal(SIGTERM, SIG_IGN) != SIG_IGN) ! 264: signal(SIGTERM, idexit); ! 265: (tmp1 = copy(tmp0))[8] = '1'; ! 266: (tmp2 = copy(tmp0))[8] = '2'; ! 267: (tmp3 = copy(tmp0))[8] = '3'; ! 268: if (oflag) ! 269: (tmp5 = copy(tmp0))[8] = '5'; ! 270: if (pflag==0) ! 271: (tmp4 = copy(tmp0))[8] = '4'; ! 272: if (Fflag) { /* mjm */ ! 273: (tmp6 = copy(tmp0))[8] = '6'; /* mjm */ ! 274: (tmp7 = copy(tmp0))[8] = '7'; /* mjm */ ! 275: } ! 276: pvt = pv; ! 277: for (i=0; i<nc; i++) { ! 278: if (nc>1) ! 279: printf("%s:\n", clist[i]); ! 280: if (getsuf(clist[i])=='s') { ! 281: assource = clist[i]; ! 282: goto assemble; ! 283: } ! 284: else ! 285: assource = tmp3; ! 286: if (pflag) ! 287: tmp4 = setsuf(clist[i], 'i'); ! 288: av[0] = "cpp"; ! 289: av[1] = clist[i]; ! 290: av[2] = exflag ? "-" : tmp4; ! 291: if(Fflag) ! 292: av[2] = tmp6; /* mjm */ ! 293: na = 3; ! 294: for(pv=ptemp; pv <pvt; pv++) ! 295: if(!Fflag || *(*pv+1) != 'P') /* mjm */ ! 296: av[na++] = *pv; /* mjm: no -P when -F */ ! 297: av[na++] = "-Uvax"; /*god: (5/23) get rid of vax define */ ! 298: av[na++] = "-Dpdp11=1"; /*god: (5/23) and define pdp11 */ ! 299: av[na++]=0; ! 300: if (callsys(passp, av)) { ! 301: cflag++; ! 302: eflag++; ! 303: continue; ! 304: } ! 305: if(Fflag) { /* mjm */ ! 306: av[0] = "fpp"; ! 307: av[1] = tmp6; ! 308: av[2] = tmp4; ! 309: av[3] = tmp7; ! 310: av[4] = rhopt; ! 311: av[5] = 0; ! 312: if (callsys(passf, av)) { /* mjm */ ! 313: eflag++; ! 314: continue; ! 315: } ! 316: } ! 317: av[0]= "11c0"; /*god*/ ! 318: if (pflag) { ! 319: cflag++; ! 320: continue; ! 321: } ! 322: j = 1; ! 323: if (zflag) ! 324: av[j++] = "-u"; ! 325: av[j++] = tmp4; ! 326: av[j++] = tmp1; ! 327: av[j++] = tmp2; ! 328: if (proflag) ! 329: av[j++] = "-P"; ! 330: av[j++] = 0; ! 331: if (callsys(pass0, av)) { ! 332: cflag++; ! 333: eflag++; ! 334: continue; ! 335: } ! 336: av[0] = "11c1"; /*god*/ ! 337: av[1] = tmp1; ! 338: av[2] = tmp2; ! 339: if (sflag) ! 340: assource = tmp3 = setsuf(clist[i], 's'); ! 341: av[3] = tmp3; ! 342: if (oflag) ! 343: av[3] = tmp5; ! 344: av[4] = 0; ! 345: if(callsys(pass1, av)) { ! 346: cflag++; ! 347: eflag++; ! 348: continue; ! 349: } ! 350: if (oflag) { ! 351: av[0] = "11c2"; /*god*/ ! 352: av[1] = tmp5; ! 353: av[2] = tmp3; ! 354: av[3] = 0; ! 355: if (callsys(pass2, av)) { ! 356: unlink(tmp3); ! 357: assource = tmp5; ! 358: } ! 359: else ! 360: unlink(tmp5); ! 361: } ! 362: if (sflag) ! 363: continue; ! 364: assemble: ! 365: av[0] = "11as"; /*god*/ ! 366: av[1] = "-u"; ! 367: av[2] = "-o"; ! 368: av[3] = setsuf(clist[i], 'o'); ! 369: av[4] = assource; ! 370: av[5] = 0; ! 371: cunlink(tmp1); ! 372: cunlink(tmp2); ! 373: cunlink(tmp4); ! 374: if (callsys(BINPATH(11as), av) > 1) { /*god*/ ! 375: cflag++; ! 376: eflag++; ! 377: continue; ! 378: } ! 379: } ! 380: nocom: ! 381: if (cflag==0 && nl!=0) { ! 382: i = 0; ! 383: av[0] = "11ld"; /*god*/ ! 384: av[1] = "-X"; ! 385: av[2] = pref; ! 386: j = 3; ! 387: if (outfile) { ! 388: av[j++] = "-o"; ! 389: av[j++] = outfile; ! 390: } ! 391: while(i<nl) ! 392: av[j++] = llist[i++]; ! 393: av[j++] = 0; ! 394: eflag |= callsys(BINPATH(11ld), av); /*god*/ ! 395: if (nc==1 && nxo==1 && eflag==0) ! 396: cunlink(setsuf(clist[0], 'o')); ! 397: } ! 398: dexit(); ! 399: } ! 400: ! 401: idexit() ! 402: { ! 403: eflag = 100; ! 404: dexit(); ! 405: } ! 406: ! 407: dexit() ! 408: { ! 409: if (!pflag) { ! 410: cunlink(tmp1); ! 411: cunlink(tmp2); ! 412: if (sflag==0) ! 413: cunlink(tmp3); ! 414: cunlink(tmp4); ! 415: cunlink(tmp5); ! 416: cunlink(tmp0); ! 417: } ! 418: if(Fflag) { /* mjm */ ! 419: cunlink(tmp6); ! 420: cunlink(tmp7); ! 421: cunlink(tmp0); ! 422: } ! 423: exit(eflag); ! 424: } ! 425: ! 426: error(s, x) ! 427: char *s, *x; ! 428: { ! 429: fprintf(exflag?stderr:stdout, s, x); ! 430: putc('\n', exflag? stderr : stdout); ! 431: cflag++; ! 432: eflag++; ! 433: } ! 434: ! 435: ! 436: ! 437: ! 438: getsuf(as) ! 439: char as[]; ! 440: { ! 441: register int c; ! 442: register char *s; ! 443: register int t; ! 444: ! 445: s = as; ! 446: c = 0; ! 447: while(t = *s++) ! 448: if (t=='/') ! 449: c = 0; ! 450: else ! 451: c++; ! 452: s -= 3; ! 453: if (c<=14 && c>2 && *s++=='.') ! 454: return(*s); ! 455: return(0); ! 456: } ! 457: ! 458: char * ! 459: setsuf(as, ch) ! 460: char *as; ! 461: { ! 462: register char *s, *s1; ! 463: ! 464: s = s1 = copy(as); ! 465: while(*s) ! 466: if (*s++ == '/') ! 467: s1 = s; ! 468: s[-1] = ch; ! 469: return(s1); ! 470: } ! 471: ! 472: callsys(f, v) ! 473: char f[], *v[]; ! 474: { ! 475: int t, status; ! 476: register char **vp; /* god */ ! 477: ! 478: if(vflag) { /* god & mjm */ ! 479: vp = v; ! 480: fprintf(stderr,"+ "); ! 481: while (*vp) ! 482: fprintf(stderr,"%s ",*vp++); ! 483: fprintf(stderr, "\n"); ! 484: } ! 485: ! 486: if ((t=fork())==0) { ! 487: execv(f, v); ! 488: printf("Can't find %s\n", f); ! 489: exit(100); ! 490: } else ! 491: if (t == -1) { ! 492: printf("Try again\n"); ! 493: return(100); ! 494: } ! 495: while(t!=wait(&status)) ! 496: ; ! 497: if (t = status&0377) { ! 498: if (t!=SIGINT) { ! 499: printf("Fatal error (%d) in %s\n", t,f); /*mjm*/ ! 500: eflag = 8; ! 501: } ! 502: dexit(); ! 503: } ! 504: return((status>>8) & 0377); ! 505: } ! 506: ! 507: char * ! 508: copy(s) ! 509: register char *s; ! 510: { ! 511: register char *ns; ! 512: ! 513: ns = stralloc(strlen(s)); ! 514: return(strcpy(ns, s)); ! 515: } ! 516: ! 517: char * ! 518: stralloc(n) ! 519: { ! 520: char *malloc(); ! 521: register char *s; ! 522: ! 523: s = malloc(n+1); ! 524: if (s==NULL) { ! 525: error("out of space", (char *)NULL); ! 526: dexit(); ! 527: } ! 528: } ! 529: ! 530: nodup(l, os) ! 531: char **l, *os; ! 532: { ! 533: register char *t, *s; ! 534: register int c; ! 535: ! 536: s = os; ! 537: if (getsuf(s) != 'o') ! 538: return(1); ! 539: while(t = *l++) { ! 540: while(c = *s++) ! 541: if (c != *t++) ! 542: break; ! 543: if (*t=='\0' && c=='\0') ! 544: return(0); ! 545: s = os; ! 546: } ! 547: return(1); ! 548: } ! 549: ! 550: cunlink(f) ! 551: char *f; ! 552: { ! 553: if (f==NULL) ! 554: return; ! 555: unlink(f); ! 556: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.