|
|
1.1 ! root 1: static char sccsid[] = "@(#)pc.c 3.8 10/19/80"; ! 2: #include <stdio.h> ! 3: #include <signal.h> ! 4: #include <wait.h> ! 5: ! 6: /* ! 7: * Pc - front end for Pascal compiler. ! 8: */ ! 9: char *pc0 = "/usr/lib/pc0"; ! 10: char *pc1 = "/lib/f1"; ! 11: char *pc2 = "/usr/lib/pc2"; ! 12: char *c2 = "/lib/c2"; ! 13: char *pc3 = "/usr/lib/pc3"; ! 14: char *ld = "/bin/ld"; ! 15: char *as = "/bin/as"; ! 16: char *lpc = "-lpc"; ! 17: char *crt0 = "/lib/crt0.o"; ! 18: char *mcrt0 = "/lib/mcrt0.o"; ! 19: ! 20: char *mktemp(); ! 21: char *tname[2]; ! 22: char *tfile[2]; ! 23: ! 24: char *setsuf(), *savestr(); ! 25: ! 26: int Jflag, Sflag, Oflag, cflag, gflag, pflag; ! 27: int debug; ! 28: ! 29: #define NARGS 512 ! 30: int ldargx = 3; ! 31: int pc0argx = 3; ! 32: char *pc0args[NARGS] = { "pc0", "-o", "XXX" }; ! 33: char *pc1args[3] = { "pc1", 0, }; ! 34: char *pc2args[2] = { "pc2", 0 }; ! 35: char *c2args[4] = { "c2", 0, 0, 0 }; ! 36: int pc3argx = 1; ! 37: #define pc3args pc0args ! 38: #define ldargs pc0args ! 39: /* char *pc3args[NARGS] = { "pc3", 0 }; */ ! 40: /* char *ldargs[NARGS] = { "ld", "-X", "/lib/crt0.o", 0, }; */ ! 41: int asargx; ! 42: char *asargs[6] = { "as", 0, }; ! 43: ! 44: /* ! 45: * If the number of .p arguments (np) is 1, and the number of .o arguments ! 46: * (nxo) is 0, and we successfully create an ``a.out'', then we remove ! 47: * the one .ps .o file (onepso). ! 48: */ ! 49: int np, nxo; ! 50: char *onepso; ! 51: int errs; ! 52: ! 53: int onintr(); ! 54: ! 55: main(argc, argv) ! 56: int argc; ! 57: char **argv; ! 58: { ! 59: register char *argp; ! 60: register int i; ! 61: int savargx; ! 62: char *t, c; ! 63: int j; ! 64: ! 65: argc--, argv++; ! 66: if (argc == 0) { ! 67: execl("/bin/cat", "cat", "/usr/lib/how_pc"); ! 68: exit(1); ! 69: } ! 70: if (signal(SIGINT, SIG_IGN) != SIG_IGN) { ! 71: signal(SIGINT, onintr); ! 72: signal(SIGTERM, onintr); ! 73: } ! 74: for (i = 0; i < argc; i++) { ! 75: argp = argv[i]; ! 76: if (argp[0] != '-') ! 77: continue; ! 78: switch (argp[1]) { ! 79: ! 80: case 'd': ! 81: if (argp[2] == 0) ! 82: debug++; ! 83: continue; ! 84: case 'i': ! 85: pc0args[pc0argx++] = "-i"; ! 86: while (i+1 < argc && argv[i+1][0] != '-' && ! 87: getsuf(argv[i+1]) != 'p') { ! 88: pc0args[pc0argx++] = argv[i+1]; ! 89: i++; ! 90: } ! 91: if (i+1 == argc) { ! 92: fprintf(stderr, "pc: bad -i construction\n"); ! 93: exit(1); ! 94: } ! 95: continue; ! 96: case 'o': ! 97: i++; ! 98: if (i == argc) { ! 99: fprintf(stderr, "pc: -o must specify file\n"); ! 100: exit(1); ! 101: } ! 102: c = getsuf(argv[i]); ! 103: if (c == 'o' || c == 'p' || c == 'c') { ! 104: fprintf(stderr, "pc: -o would overwrite %s\n", ! 105: argv[i]); ! 106: exit(1); ! 107: } ! 108: continue; ! 109: case 'O': ! 110: Oflag = 1; ! 111: continue; ! 112: case 'S': ! 113: Sflag = 1; ! 114: continue; ! 115: case 'J': ! 116: Jflag = 1; ! 117: continue; ! 118: case 'T': ! 119: switch (argp[2]) { ! 120: ! 121: case '0': ! 122: pc0 = "/usr/src/new/pc0/a.out"; ! 123: continue; ! 124: case '1': ! 125: pc1 = "/usr/src/new/pcc/pc1"; ! 126: continue; ! 127: case '2': ! 128: pc2 = "/usr/src/new/pc2/a.out"; ! 129: continue; ! 130: case '3': ! 131: pc3 = "/usr/src/new/pc3/a.out"; ! 132: continue; ! 133: case 'l': ! 134: lpc = "/usr/src/lib/libpc/pclib"; ! 135: continue; ! 136: } ! 137: continue; ! 138: case 'c': ! 139: cflag = 1; ! 140: continue; ! 141: case 'l': ! 142: if (argp[2]) ! 143: continue; ! 144: /* fall into ... */ ! 145: case 'b': ! 146: case 'g': ! 147: case 's': ! 148: case 'w': ! 149: case 'z': ! 150: case 'C': ! 151: pc0args[pc0argx++] = argp; ! 152: if (argp[1] == 'g') ! 153: gflag = 1; ! 154: continue; ! 155: case 't': ! 156: fprintf(stderr, "pc: -t is default; -C for checking\n"); ! 157: continue; ! 158: case 'p': ! 159: crt0 = mcrt0; ! 160: pflag++; ! 161: continue; ! 162: } ! 163: } ! 164: if (gflag && Oflag) { ! 165: fprintf(stderr, "pc: warning: -g overrides -O\n"); ! 166: Oflag = 0; ! 167: } ! 168: tname[0] = mktemp("/tmp/p0XXXXXX"); ! 169: tname[1] = mktemp("/tmp/p1XXXXXX"); ! 170: savargx = pc0argx; ! 171: for (i = 0; i < argc; i++) { ! 172: argp = argv[i]; ! 173: if (argp[0] == '-') ! 174: continue; ! 175: if (suffix(argp) == 's') { ! 176: asargx = 1; ! 177: if (Jflag) ! 178: asargs[asargx++] = "-J"; ! 179: asargs[asargx++] = argp; ! 180: asargs[asargx++] = "-o"; ! 181: tfile[1] = setsuf(argp, 'o'); ! 182: asargs[asargx++] = tfile[1]; ! 183: asargs[asargx] = 0; ! 184: if (dosys(as, asargs, 0, 0)) ! 185: continue; ! 186: tfile[1] = 0; ! 187: continue; ! 188: } ! 189: if (suffix(argp) != 'p') ! 190: continue; ! 191: tfile[0] = tname[0]; ! 192: pc0args[2] = tfile[0]; ! 193: pc0argx = savargx; ! 194: if (pflag) ! 195: pc0args[pc0argx++] = "-p"; ! 196: pc0args[pc0argx++] = argp; ! 197: pc0args[pc0argx] = 0; ! 198: if (dosys(pc0, pc0args, 0, 0)) ! 199: continue; ! 200: pc1args[1] = tfile[0]; ! 201: tfile[1] = tname[1]; ! 202: if (dosys(pc1, pc1args, 0, tfile[1])) ! 203: continue; ! 204: unlink(tfile[0]); ! 205: if (Sflag && !Oflag) ! 206: tfile[0] = setsuf(argp, 's'); ! 207: else ! 208: tfile[0] = tname[0]; ! 209: if (dosys(pc2, pc2args, tfile[1], tfile[0])) ! 210: continue; ! 211: unlink(tfile[1]); ! 212: tfile[1] = 0; ! 213: if (Oflag) { ! 214: if (Sflag) ! 215: tfile[1] = setsuf(argp, 's'); ! 216: else ! 217: tfile[1] = tname[1]; ! 218: if (dosys(c2, c2args, tfile[0], tfile[1])) ! 219: continue; ! 220: unlink(tfile[0]); ! 221: tfile[0] = tfile[1]; ! 222: tfile[1] = 0; ! 223: } ! 224: if (Sflag) { ! 225: tfile[0] = 0; ! 226: continue; ! 227: } ! 228: asargx = 1; ! 229: if (Jflag) ! 230: asargs[asargx++] = "-J"; ! 231: asargs[asargx++] = tfile[0]; ! 232: asargs[asargx++] = "-o"; ! 233: tfile[1] = setsuf(argp, 'o'); ! 234: asargs[asargx++] = tfile[1]; ! 235: asargs[asargx] = 0; ! 236: if (dosys(as, asargs, 0, 0)) ! 237: continue; ! 238: tfile[1] = 0; ! 239: remove(); ! 240: } ! 241: if (errs || cflag || Sflag) ! 242: done(); ! 243: /* char *pc3args[NARGS] = { "pc3", 0 }; */ ! 244: pc3args[0] = "pc3"; ! 245: for (i = 0; i < argc; i++) { ! 246: argp = argv[i]; ! 247: if (!strcmp(argp, "-o")) ! 248: i++; ! 249: if (argp[0] == '-') ! 250: continue; ! 251: switch (getsuf(argp)) { ! 252: ! 253: case 'o': ! 254: pc3args[pc3argx++] = argp; ! 255: nxo++; ! 256: continue; ! 257: case 's': ! 258: case 'p': ! 259: onepso = pc3args[pc3argx++] = ! 260: savestr(setsuf(argp, 'o')); ! 261: np++; ! 262: continue; ! 263: } ! 264: } ! 265: pc3args[pc3argx] = 0; ! 266: if (dosys(pc3, pc3args, 0, 0)) ! 267: done(); ! 268: /* char *ldargs[NARGS] = { "ld", "-X", "/lib/crt0.o", 0, }; */ ! 269: ldargs[0] = "ld"; ! 270: ldargs[1] = "-X"; ! 271: ldargs[2] = crt0; ! 272: for (i = 0; i < argc; i++) { ! 273: argp = argv[i]; ! 274: if (argp[0] != '-') { ! 275: switch (getsuf(argp)) { ! 276: ! 277: case 'p': ! 278: case 's': ! 279: ldargs[ldargx] = savestr(setsuf(argp, 'o')); ! 280: break; ! 281: default: ! 282: ldargs[ldargx] = argp; ! 283: break; ! 284: } ! 285: if (getsuf(ldargs[ldargx]) == 'o') ! 286: for (j = 0; j < ldargx; j++) ! 287: if (!strcmp(ldargs[j], ldargs[ldargx])) ! 288: goto duplicate; ! 289: ldargx++; ! 290: duplicate: ! 291: continue; ! 292: } ! 293: switch (argp[1]) { ! 294: ! 295: case 'i': ! 296: while (i+1 < argc && argv[i+1][0] != '-' && ! 297: getsuf(argv[i+1]) != 'p') ! 298: i++; ! 299: continue; ! 300: case 'd': ! 301: if (argp[2] == 0) ! 302: continue; ! 303: ldargs[ldargx++] = argp; ! 304: continue; ! 305: case 'o': ! 306: ldargs[ldargx++] = argp; ! 307: i++; ! 308: ldargs[ldargx++] = argv[i]; ! 309: continue; ! 310: case 'l': ! 311: if (argp[2]) ! 312: ldargs[ldargx++] = argp; ! 313: continue; ! 314: case 'c': ! 315: case 'g': ! 316: case 'w': ! 317: case 'p': ! 318: case 'S': ! 319: case 'J': ! 320: case 'T': ! 321: case 'O': ! 322: case 'C': ! 323: case 'b': ! 324: case 's': ! 325: case 'z': ! 326: continue; ! 327: default: ! 328: ldargs[ldargx++] = argp; ! 329: continue; ! 330: } ! 331: } ! 332: ldargs[ldargx++] = lpc; ! 333: if (gflag) ! 334: ldargs[ldargx++] = "-lg"; ! 335: ldargs[ldargx++] = "-lm"; ! 336: ldargs[ldargx++] = "-lc"; ! 337: ldargs[ldargx] = 0; ! 338: if (dosys(ld, ldargs, 0, 0)==0 && np == 1 && nxo == 0) ! 339: unlink(onepso); ! 340: done(); ! 341: } ! 342: ! 343: dosys(cmd, argv, in, out) ! 344: char *cmd, **argv, *in, *out; ! 345: { ! 346: union wait status; ! 347: int pid; ! 348: ! 349: if (debug) { ! 350: int i; ! 351: printf("%s:", cmd); ! 352: for (i = 0; argv[i]; i++) ! 353: printf(" %s", argv[i]); ! 354: if (in) ! 355: printf(" <%s", in); ! 356: if (out) ! 357: printf(" >%s", out); ! 358: printf("\n"); ! 359: } ! 360: pid = vfork(); ! 361: if (pid < 0) { ! 362: fprintf(stderr, "pc: No more processes\n"); ! 363: done(); ! 364: } ! 365: if (pid == 0) { ! 366: if (in) { ! 367: close(0); ! 368: if (open(in, 0) != 0) { ! 369: perror(in); ! 370: exit(1); ! 371: } ! 372: } ! 373: if (out) { ! 374: close(1); ! 375: unlink(out); ! 376: if (creat(out, 0666) != 1) { ! 377: perror(out); ! 378: exit(1); ! 379: } ! 380: } ! 381: signal(SIGINT, SIG_DFL); ! 382: execv(cmd, argv); ! 383: perror(cmd); ! 384: exit(1); ! 385: } ! 386: while (wait(&status) != pid) ! 387: ; ! 388: if (WIFSIGNALED(status)) { ! 389: if (status.w_termsig != SIGINT) ! 390: fprintf(stderr, "Fatal error in %s\n", cmd); ! 391: errs = 100; ! 392: done(); ! 393: /*NOTREACHED*/ ! 394: } ! 395: if (status.w_retcode) { ! 396: errs = 1; ! 397: remove(); ! 398: } ! 399: return (status.w_retcode); ! 400: } ! 401: ! 402: done() ! 403: { ! 404: ! 405: remove(); ! 406: exit(errs); ! 407: } ! 408: ! 409: remove() ! 410: { ! 411: ! 412: if (tfile[0]) ! 413: unlink(tfile[0]); ! 414: if (tfile[1]) ! 415: unlink(tfile[1]); ! 416: } ! 417: ! 418: onintr() ! 419: { ! 420: ! 421: errs = 1; ! 422: done(); ! 423: } ! 424: ! 425: getsuf(cp) ! 426: char *cp; ! 427: { ! 428: ! 429: if (*cp == 0) ! 430: return; ! 431: while (cp[1]) ! 432: cp++; ! 433: if (cp[-1] != '.') ! 434: return (0); ! 435: return (*cp); ! 436: } ! 437: ! 438: char * ! 439: setsuf(as, ch) ! 440: char *as; ! 441: { ! 442: register char *s, *s1; ! 443: ! 444: s = s1 = savestr(as); ! 445: while (*s) ! 446: if (*s++ == '/') ! 447: s1 = s; ! 448: s[-1] = ch; ! 449: return (s1); ! 450: } ! 451: ! 452: #define NSAVETAB 512 ! 453: char *savetab; ! 454: int saveleft; ! 455: ! 456: char * ! 457: savestr(cp) ! 458: register char *cp; ! 459: { ! 460: register int len; ! 461: ! 462: len = strlen(cp) + 1; ! 463: if (len > saveleft) { ! 464: saveleft = NSAVETAB; ! 465: if (len > saveleft) ! 466: saveleft = len; ! 467: savetab = (char *)malloc(saveleft); ! 468: if (savetab == 0) { ! 469: fprintf(stderr, "ran out of memory (savestr)\n"); ! 470: exit(1); ! 471: } ! 472: } ! 473: strncpy(savetab, cp, len); ! 474: cp = savetab; ! 475: savetab += len; ! 476: return (cp); ! 477: } ! 478: ! 479: suffix(cp) ! 480: char *cp; ! 481: { ! 482: ! 483: if (cp[0] == 0 || cp[1] == 0) ! 484: return (0); ! 485: while (cp[1]) ! 486: cp++; ! 487: if (cp[-1] == '.') ! 488: return (*cp); ! 489: return (0); ! 490: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.