Annotation of 41BSD/cmd/pascal/pc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.