Annotation of 43BSDTahoe/bin/cc.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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