Annotation of researchv10no/cmd/cc.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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