Annotation of 3BSD/cmd/cc.c, revision 1.1.1.1

1.1       root        1: #
                      2: # include <stdio.h>
                      3: # include <ctype.h>
                      4: # include <signal.h>
                      5: /* C command */
                      6: 
                      7: # define SBSIZE 10000
                      8: # define MAXINC 10
                      9: # define MAXFIL 100
                     10: # define MAXLIB 100
                     11: # define MAXOPT 100
                     12: char   tmp0[30];
                     13: char   *tmp1;
                     14: char   *tmp2;
                     15: char   *tmp3;
                     16: char   *tmp4;
                     17: char   *tmp5;
                     18: char   *outfile;
                     19: char *copy(),*setsuf();
                     20: # define CHSPACE 1000
                     21: char   ts[CHSPACE+50];
                     22: char   *tsa = ts;
                     23: char   *tsp = ts;
                     24: char   *av[50];
                     25: char   *clist[MAXFIL];
                     26: char   *llist[MAXLIB];
                     27: char   *alist[20];
                     28: int Wflag;
                     29: int dflag;
                     30: int    pflag;
                     31: int    sflag;
                     32: int    cflag;
                     33: int    eflag;
                     34: int    gflag;
                     35: int    exflag;
                     36: int    oflag;
                     37: int    proflag;
                     38: int    noflflag;
                     39: int    exfail;
                     40: char   *chpass ;
                     41: char   *npassname ;
                     42: char   pass0[40] = "/lib/ccom";
                     43: char   pass2[20] = "/lib/c2";
                     44: char   passp[20] = "/lib/cpp";
                     45: char   *pref = "/lib/crt0.o";
                     46: 
                     47: main(argc, argv)
                     48: char *argv[]; {
                     49:        char *t;
                     50:        char *savetsp;
                     51:        char *assource;
                     52:        char **pv, *ptemp[MAXOPT], **pvt;
                     53:        int nc, nl, i, j, c, f20, nxo, na;
                     54:        int idexit();
                     55: 
                     56:        i = nc = nl = f20 = nxo = 0;
                     57:        pv = ptemp;
                     58:        while(++i < argc) {
                     59:                if(*argv[i] == '-') switch (argv[i][1]) {
                     60:                default:
                     61:                        goto passa;
                     62:                case 'S':
                     63:                        sflag++;
                     64:                        cflag++;
                     65:                        break;
                     66:                case 'o':
                     67:                        if (++i < argc) {
                     68:                                char t;
                     69:                                outfile = argv[i];
                     70:                                if ((t=getsuf(outfile))=='c'||t=='o') {
                     71:                                        error("Would overwrite %s", outfile);
                     72:                                        exit(8);
                     73:                                }
                     74:                        }
                     75:                        break;
                     76:                case 'O':
                     77:                        oflag++;
                     78:                        break;
                     79:                case 'p':
                     80:                        proflag++;
                     81:                        break;
                     82:                case 'g':
                     83:                        gflag++;
                     84:                        break;
                     85:                case 'W':       /* deprecated */
                     86:                case 'w':
                     87:                        Wflag++;
                     88:                        break;
                     89:                case 'E':
                     90:                        exflag++;
                     91:                case 'P':
                     92:                        pflag++;
                     93:                        if (argv[i][1]=='P')
                     94:                        fprintf(stderr, "(Warning): -P option obsolete\n");
                     95:                        *pv++ = argv[i];
                     96:                case 'c':
                     97:                        cflag++;
                     98:                        break;
                     99: 
                    100:                case 'f':
                    101:                        noflflag++;
                    102:                        if (npassname || chpass)
                    103:                                error("-f overwrites earlier option",0);
                    104:                        npassname = "/lib/f";
                    105:                        chpass = "12";
                    106:                        break;
                    107: 
                    108:                case '2':
                    109:                        if(argv[i][2] == '\0')
                    110:                                pref = "/lib/crt2.o";
                    111:                        else {
                    112:                                pref = "/lib/crt20.o";
                    113:                                f20 = 1;
                    114:                        }
                    115:                        break;
                    116:                case 'D':
                    117:                case 'I':
                    118:                case 'U':
                    119:                case 'C':
                    120:                        *pv++ = argv[i];
                    121:                        if (pv >= ptemp+MAXOPT)
                    122:                                {
                    123:                                error("Too many DIUC options", 0);
                    124:                                --pv;
                    125:                                }
                    126:                        break;
                    127:                case 't':
                    128:                        if (chpass)
                    129:                                error("-t overwrites earlier option",0);
                    130:                        chpass = argv[i]+2;
                    131:                        if (chpass[0]==0)
                    132:                                chpass = "012p";
                    133:                        break;
                    134: 
                    135:                case 'B':
                    136:                        if (npassname)
                    137:                                error("-B overwrites earlier option", 0);
                    138:                        npassname = argv[i]+2;
                    139:                        if (npassname[0]==0)
                    140:                                npassname = "/usr/c/o";
                    141:                        break;
                    142: 
                    143:                case 'd':
                    144:                        dflag++;
                    145:                        strcpyn(alist, argv[i], 19);
                    146:                        break;
                    147:                } else {
                    148:                passa:
                    149:                        t = argv[i];
                    150:                        if((c=getsuf(t))=='c' || c=='s'|| exflag) {
                    151:                                clist[nc++] = t;
                    152:                                if (nc>=MAXFIL)
                    153:                                        {
                    154:                                        error("Too many source files",0);
                    155:                                        exit(1);
                    156:                                        }
                    157:                                t = setsuf(t, 'o');
                    158:                        }
                    159:                        if (nodup(llist, t)) {
                    160:                                llist[nl++] = t;
                    161:                                if (nl >= MAXLIB)
                    162:                                        {
                    163:                                        error("Too many object/library files",0);
                    164:                                        exit(1);
                    165:                                        }
                    166:                                if (getsuf(t)=='o')
                    167:                                        nxo++;
                    168:                        }
                    169:                }
                    170:        }
                    171:        if (gflag) oflag = 0;
                    172:        if (npassname && chpass ==0)
                    173:                chpass = "012p";
                    174:        if (chpass && npassname==0)
                    175:                npassname = "/usr/c/";
                    176:        if (chpass)
                    177:        for (t=chpass; *t; t++)
                    178:                {
                    179:                switch (*t)
                    180:                        {
                    181:                        case '0':
                    182:                                strcpy (pass0, npassname);
                    183:                                strcat (pass0, "ccom");
                    184:                                continue;
                    185:                        case '2':
                    186:                                strcpy (pass2, npassname);
                    187:                                strcat (pass2, "c2");
                    188:                                continue;
                    189:                        case 'p':
                    190:                                strcpy (passp, npassname);
                    191:                                strcat (passp, "cpp");
                    192:                                continue;
                    193:                        }
                    194:                }
                    195:        if (noflflag)
                    196:                pref = proflag ? "/lib/fmcrt0.o" : "/lib/fcrt0.o";
                    197:        else if (proflag)
                    198:                pref = "/lib/mcrt0.o";
                    199:        if(nc==0)
                    200:                goto nocom;
                    201:        if (pflag==0) {
                    202:                FILE *c;
                    203:                sprintf(tmp0,"/tmp/ctm%05.5da",getpid());
                    204:                while((c=fopen(tmp0, "r")) != NULL) {
                    205:                        fclose(c);
                    206:                        tmp0[9]++;
                    207:                }
                    208:                while((creat(tmp0, 0400))<0)
                    209:                        tmp0[9]++;
                    210:        }
                    211:        if (signal(SIGINT, SIG_IGN) != SIG_IGN) /* interrupt */
                    212:                signal(SIGINT, idexit);
                    213:        if (signal(SIGTERM, SIG_IGN) != SIG_IGN)        /* terminate */
                    214:                signal(SIGTERM, idexit);
                    215:        (tmp1 = copy(tmp0))[13] = '1';
                    216:        (tmp2 = copy(tmp0))[13] = '2';
                    217:        (tmp3 = copy(tmp0))[13] = '3';
                    218:        if (oflag)
                    219:                (tmp5 = copy(tmp0))[13] = '5';
                    220:        if (pflag==0)
                    221:                (tmp4 = copy(tmp0))[13] = '4';
                    222:        pvt = pv;
                    223:        for (i=0; i<nc; i++) {
                    224:                if (nc>1) {
                    225:                        printf("%s:\n", clist[i]);
                    226:                        fflush(stdout);
                    227:                }
                    228:                if (getsuf(clist[i])=='s') {
                    229:                        assource = clist[i];
                    230:                        goto assemble;
                    231:                } else
                    232:                        assource = tmp3;
                    233:                if (pflag)
                    234:                        tmp4 = setsuf(clist[i], 'i');
                    235:                savetsp = tsp;
                    236:                av[0] = "cpp";
                    237:                av[1] = clist[i];
                    238:                av[2] = exflag ? "-" : tmp4;
                    239:                na = 3;
                    240:                for(pv=ptemp; pv <pvt; pv++)
                    241:                        av[na++] = *pv;
                    242:                av[na++]=0;
                    243:                if (callsys(passp, av))
                    244:                        {exfail++; eflag++;}
                    245:                av[1] =tmp4;
                    246:                tsp = savetsp;
                    247:                av[0]= "ccom";
                    248:                if (pflag || exfail)
                    249:                        {
                    250:                        cflag++;
                    251:                        continue;
                    252:                        }
                    253:                if(sflag)
                    254:                        assource = tmp3 = setsuf(clist[i], 's');
                    255:                av[2] = tmp3;
                    256:                if(oflag)
                    257:                        av[2] = tmp5;
                    258:                if (proflag) {
                    259:                        av[3] = "-XP";
                    260:                        av[4] = 0;
                    261:                } else
                    262:                        av[3] = 0;
                    263:                if (gflag) {
                    264:                        int i;
                    265: 
                    266:                        i = av[3] ? 4 : 3;
                    267:                        av[i++] = "-Xg";
                    268:                        av[i] = 0;
                    269:                }
                    270:                if (Wflag) {
                    271:                        int i;
                    272: 
                    273:                        for (i = 3; i < 10 && av[i] != 0; i++)
                    274:                                ;
                    275:                        av[i] = "-W";
                    276:                        av[++i] = 0;
                    277:                }
                    278:                                
                    279:                if (callsys(pass0, av)) {
                    280:                        cflag++;
                    281:                        eflag++;
                    282:                        continue;
                    283:                }
                    284:                if (oflag) {
                    285:                        av[0] = "c2";
                    286:                        av[1] = tmp5;
                    287:                        av[2] = tmp3;
                    288:                        av[3] = 0;
                    289:                        if (callsys(pass2, av)) {
                    290:                                unlink(tmp3);
                    291:                                tmp3 = assource = tmp5;
                    292:                        } else
                    293:                                unlink(tmp5);
                    294:                }
                    295:                if (sflag)
                    296:                        continue;
                    297:        assemble:
                    298:                av[0] = "as";
                    299:                av[1] = "-o";
                    300:                av[2] = setsuf(clist[i], 'o');
                    301:                av[3] = assource;
                    302:                if (dflag) {
                    303:                        av[4] = alist;
                    304:                        av[5] = 0;
                    305:                } else
                    306:                        av[4] = 0;
                    307:                cunlink(tmp1);
                    308:                cunlink(tmp2);
                    309:                cunlink(tmp4);
                    310:                if (callsys("/bin/as", av) > 1) {
                    311:                        cflag++;
                    312:                        eflag++;
                    313:                        continue;
                    314:                }
                    315:        }
                    316: nocom:
                    317:        if (cflag==0 && nl!=0) {
                    318:                i = 0;
                    319:                av[0] = "ld";
                    320:                av[1] = "-X";
                    321:                av[2] = pref;
                    322:                j = 3;
                    323:                if (outfile) {
                    324:                        av[j++] = "-o";
                    325:                        av[j++] = outfile;
                    326:                }
                    327:                while(i<nl)
                    328:                        av[j++] = llist[i++];
                    329:                if (gflag)
                    330:                        av[j++] = "-lg";
                    331:                if(f20)
                    332:                        av[j++] = "-l2";
                    333:                else {
                    334:                        av[j++] = "/lib/libc.a";
                    335:                        av[j++] = "-l";
                    336:                }
                    337:                av[j++] = 0;
                    338:                eflag |= callsys("/bin/ld", av);
                    339:                if (nc==1 && nxo==1 && eflag==0)
                    340:                        cunlink(setsuf(clist[0], 'o'));
                    341:        }
                    342:        dexit();
                    343: }
                    344: 
                    345: idexit()
                    346: {
                    347:        eflag = 100;
                    348:        dexit();
                    349: }
                    350: 
                    351: dexit()
                    352: {
                    353:        if (!pflag) {
                    354:                cunlink(tmp1);
                    355:                cunlink(tmp2);
                    356:                if (sflag==0)
                    357:                        cunlink(tmp3);
                    358:                cunlink(tmp4);
                    359:                cunlink(tmp5);
                    360:                cunlink(tmp0); 
                    361:        }
                    362:        exit(eflag);
                    363: }
                    364: 
                    365: error(s, x)
                    366: {
                    367:        fprintf(exflag?stderr:stdout , s, x);
                    368:        putc('\n', exflag? stderr : stdout);
                    369:        exfail++;
                    370:        cflag++;
                    371:        eflag++;
                    372: }
                    373: 
                    374: 
                    375: 
                    376: 
                    377: getsuf(as)
                    378: char as[];
                    379: {
                    380:        register int c;
                    381:        register char *s;
                    382:        register int t;
                    383: 
                    384:        s = as;
                    385:        c = 0;
                    386:        while(t = *s++)
                    387:                if (t=='/')
                    388:                        c = 0;
                    389:                else
                    390:                        c++;
                    391:        s -= 3;
                    392:        if (c<=14 && c>2 && *s++=='.')
                    393:                return(*s);
                    394:        return(0);
                    395: }
                    396: 
                    397: char *
                    398: setsuf(as, ch)
                    399: char as[];
                    400: {
                    401:        register char *s, *s1;
                    402: 
                    403:        s = s1 = copy(as);
                    404:        while(*s)
                    405:                if (*s++ == '/')
                    406:                        s1 = s;
                    407:        s[-1] = ch;
                    408:        return(s1);
                    409: }
                    410: 
                    411: callsys(f, v)
                    412: char f[], *v[]; {
                    413:        int t, status;
                    414: 
                    415:        if ((t=vfork())==0) {
                    416:                execv(f, v);
                    417:                printf("Can't find %s\n", f);
                    418:                fflush(stdout);
                    419:                _exit(100);
                    420:        } else
                    421:                if (t == -1) {
                    422:                        printf("Try again\n");
                    423:                        return(100);
                    424:                }
                    425:        while(t!=wait(&status));
                    426:        if ((t=(status&0377)) != 0 && t!=14) {
                    427:                if (t!=2)               /* interrupt */
                    428:                        {
                    429:                        printf("Fatal error in %s\n", f);
                    430:                        eflag = 8;
                    431:                        }
                    432:                dexit();
                    433:        }
                    434:        return((status>>8) & 0377);
                    435: }
                    436: 
                    437: char *
                    438: copy(as)
                    439: char as[];
                    440: {
                    441:        register char *otsp, *s;
                    442:        int i;
                    443: 
                    444:        otsp = tsp;
                    445:        s = as;
                    446:        while(*tsp++ = *s++);
                    447:        if (tsp >tsa+CHSPACE)
                    448:                {
                    449:                tsp = tsa = i = calloc(CHSPACE+50,1);
                    450:                if (i== -1){
                    451:                        error("no space for file names");
                    452:                        dexit(8);
                    453:                        }
                    454:                }
                    455:        return(otsp);
                    456: }
                    457: 
                    458: nodup(l, os)
                    459: char **l, *os;
                    460: {
                    461:        register char *t, *s;
                    462:        register int c;
                    463: 
                    464:        s = os;
                    465:        if (getsuf(s) != 'o')
                    466:                return(1);
                    467:        while(t = *l++) {
                    468:                while(c = *s++)
                    469:                        if (c != *t++)
                    470:                                break;
                    471:                if (*t=='\0' && c=='\0')
                    472:                        return(0);
                    473:                s = os;
                    474:        }
                    475:        return(1);
                    476: }
                    477: 
                    478: cunlink(f)
                    479: char *f;
                    480: {
                    481:        if (f==0)
                    482:                return(0);
                    483:        return(unlink(f));
                    484: }

unix.superglobalmegacorp.com

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