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

1.1       root        1: # include <stdio.h>
                      2: # include <ctype.h>
                      3: # include <signal.h>
                      4: 
                      5: # include "11cc.h"             /* god: has all the local pathnames */
                      6: 
                      7: /* 11cc command */
                      8: 
                      9: # define MAXINC 10
                     10: # define MAXFIL 100
                     11: # define MAXLIB 100
                     12: # define MAXOPT 100
                     13: char   *tmp0;
                     14: char   *tmp1;
                     15: char   *tmp2;
                     16: char   *tmp3;
                     17: char   *tmp4;
                     18: char   *tmp5;
                     19: char   *tmp6, *tmp7;   /* mjm */
                     20: char   *outfile;
                     21: char   *av[50];
                     22: char   *clist[MAXFIL];
                     23: char   *llist[MAXLIB];
                     24: int    pflag;
                     25: int    sflag;
                     26: int    cflag;
                     27: int    eflag;
                     28: int    exflag;
                     29: int    oflag;
                     30: int    Fflag;  /* mjm: RH fpp */
                     31: int    vflag;  /* mjm: verbose */
                     32: int    proflag;
                     33: int    noflflag;
                     34: int    zflag;          /* request zero-extension on all chars */
                     35: char   *chpass ;
                     36: char   *npassname ;
                     37: char   pass0[50] = LIBPATH(11c0);              /*god*/
                     38: char   pass1[50] = LIBPATH(11c1);              /*god*/
                     39: char   pass2[50] = LIBPATH(11c2);              /*god*/
                     40: char   passp[50] = "/lib/cpp";                 /*god*/
                     41: char   passf[50] = LIBPATH(fpp);               /*mjm*/
                     42: char   *pref = LIBPATH(11crt0.o);              /*god*/
                     43: char   *copy();
                     44: char   *setsuf();
                     45: char   *strcat();
                     46: char   *strcpy();
                     47: char   *stralloc();
                     48: extern int optind;
                     49: extern int opterr;
                     50: extern char *optarg;
                     51: extern int optopt;
                     52: 
                     53: main(argc, argv)
                     54: char *argv[]; 
                     55: {
                     56:        char *rhopt;    /* mjm */
                     57:        char *t;
                     58:        char *assource;
                     59:        char **pv, *ptemp[MAXOPT], **pvt;
                     60:        int nc, nl, i, j, c, nxo, na;
                     61:        int idexit();
                     62: 
                     63:        opterr = 0;
                     64:        i = nc = nl = nxo = 0;
                     65:        setbuf(stdout, (char *)NULL);
                     66:        pv = ptemp;
                     67:        while (optind<argc)
                     68:            switch (c = getopt(argc, argv, "So:OpEPcfL:l:D:I:U:C:t:B:zvF")) {
                     69:        case 'S':
                     70:                sflag++;
                     71:                cflag++;
                     72:                continue;
                     73: 
                     74:        case 'o':
                     75:                outfile = optarg;
                     76:                if ((c=getsuf(outfile))=='c'||c=='o') {
                     77:                        error("Would overwrite %s", outfile);
                     78:                        exit(8);
                     79:                }
                     80:                continue;
                     81: 
                     82:        case 'O':
                     83:                oflag++;
                     84:                continue;
                     85: 
                     86:        case 'p':
                     87:                error("profiling not supported", (char *)NULL); /*god*/
                     88:                exit(-1); /*god*/
                     89: /*god*/                /*proflag++;
                     90:                continue;*/     /*god*/
                     91: 
                     92:        case 'E':
                     93:                exflag++;
                     94:                cflag++;
                     95:                pflag++;
                     96:                *pv++ = "-E";
                     97:                continue;
                     98: 
                     99:        case 'P':
                    100:                pflag++;
                    101:                *pv++ = "-P";
                    102:        case 'c':
                    103:                cflag++;
                    104:                continue;
                    105: 
                    106:        case 'f':
                    107: /*god*/                error("floating point interpreter not supported",(char *)NULL);
                    108:                error("use -F to invoke floating point preprocessor",
                    109:                        (char *)NULL); /*god*/
                    110:                exit(-1); /*god*/
                    111: /*god*/                /*noflflag++;
                    112:                if (npassname || chpass)
                    113:                        error("-f overwrites earlier option", (char *)NULL);
                    114:                npassname = "/lib/f";
                    115:                chpass = "1";
                    116:                continue;*/             /*god*/
                    117: 
                    118:        case 'L':
                    119:                t = stralloc(strlen(optarg)+2);
                    120:                t[0] = '-';
                    121:                t[1] = 'L';
                    122:                t[2] = '\0';
                    123:                strcat(t, optarg);
                    124:                llist[nl++] = t;
                    125:                break;
                    126: 
                    127:        case 'l':
                    128:                t = stralloc(strlen(optarg)+2);
                    129:                t[0] = '-';
                    130:                t[1] = 'l';
                    131:                t[2] = '\0';
                    132:                strcat(t, optarg);
                    133:                llist[nl++] = t;
                    134:                break;
                    135: 
                    136:        case 'D':
                    137:        case 'I':
                    138:        case 'U':
                    139:        case 'C':
                    140:                *pv = stralloc(strlen(optarg)+2);
                    141:                if (pv >= ptemp+MAXOPT) {
                    142:                        error("Too many DIUC options", (char *)NULL);
                    143:                        dexit();
                    144:                }
                    145:                (*pv)[0] = '-';
                    146:                (*pv)[1] = c;
                    147:                (*pv)[2] = '\0';
                    148:                strcat(*pv, optarg);
                    149:                pv++;
                    150:                break;
                    151: 
                    152:        case 't':
                    153:                if (chpass)
                    154:                        error("-t overwrites earlier option", (char *)NULL);
                    155:                chpass = optarg;
                    156:                if (chpass[0]==0)
                    157:                        chpass = "012pf"; /*god: allow select fpp pass*/
                    158:                break;
                    159: 
                    160:        case 'B':
                    161:                if (npassname)
                    162:                        error("-B overwrites earlier option", (char *)NULL);
                    163:                npassname = optarg;
                    164:                if (npassname[0]==0)
                    165:                        npassname = LIBPATH(11);        /*god*/
                    166:                break;
                    167: 
                    168:        case '?':
                    169:                t = stralloc(3);
                    170:                t[0] = '-';
                    171:                t[1] = optopt;
                    172:                t[2] = '\0';
                    173:                llist[nl++] = t;
                    174:                break;
                    175: 
                    176:        case 'z':
                    177:                zflag++;
                    178:                break;
                    179: 
                    180:        case 'v':               /* mjm: callsys print */
                    181:                vflag++;
                    182:                break;
                    183: 
                    184:        case 'F':               /* mjm: RH fpp */
                    185:                Fflag++;
                    186:                if( (optind < argc)/*god*/ && (argv[optind][1] == 'F') )
                    187:                        rhopt = argv[optind];
                    188:                else if(argv[optind-1][1] == 'F')
                    189:                        rhopt = argv[optind-1];
                    190:                for(t = rhopt+2; *t != '\0'; t++)       /* skip rest after -F */
                    191:                        getopt(argc, argv, "qunl");
                    192:                break;
                    193: 
                    194:        case EOF:
                    195:                t = argv[optind];
                    196:                optind++;
                    197:                if((c=getsuf(t))=='c' || c=='s'|| exflag) {
                    198:                        clist[nc++] = t;
                    199:                        if (nc>=MAXFIL) {
                    200:                                error("Too many source files", (char *)NULL);
                    201:                                exit(1);
                    202:                        }
                    203:                        t = setsuf(t, 'o');
                    204:                }
                    205:                if (nodup(llist, t)) {
                    206:                        llist[nl++] = t;
                    207:                        if (nl >= MAXLIB) {
                    208:                                error("Too many object/library files", (char *)NULL);
                    209:                                exit(1);
                    210:                        }
                    211:                        if (getsuf(t)=='o')
                    212:                                nxo++;
                    213:                }
                    214:        }
                    215:        if (npassname && chpass ==0)
                    216:                chpass = "012pf";               /*god: allow select fpp pass*/
                    217:        if (chpass && npassname==0)
                    218:                npassname = LIBPATH(11);        /*god*/
                    219:        if (chpass)
                    220:                for (t=chpass; *t; t++) {
                    221:                        switch (*t) {
                    222:                        case '0':
                    223:                                strcpy (pass0, npassname);
                    224:                                strcat (pass0, "c0");
                    225:                                continue;
                    226:                        case '1':
                    227:                                strcpy (pass1, npassname);
                    228:                                strcat (pass1, "c1");
                    229:                                continue;
                    230:                        case '2':
                    231:                                strcpy (pass2, npassname);
                    232:                                strcat (pass2, "c2");
                    233:                                continue;
                    234:                        case 'p':
                    235:                                strcpy (passp, npassname);
                    236:                                strcat (passp, "cpp");
                    237:                                continue;
                    238:                        case 'f':               /*god: include fpp in here */
                    239:                                strcpy (passf, npassname);
                    240:                                strcat (passf, "fpp");
                    241:                        }
                    242:                }
                    243: /*god*/        /*if (noflflag)
                    244:                pref = proflag ? "/lib/fmcrt0.o" : "/lib/fcrt0.o";
                    245:        else if (proflag)
                    246:                pref = "/lib/mcrt0.o";*/        /*god*/
                    247:        if(nc==0)
                    248:                goto nocom;
                    249:        if (pflag==0 || Fflag) {        /* mjm: added Fflag */
                    250:                tmp0 = copy("/tmp/ctm0a");
                    251:                while (access(tmp0, 0)==0)
                    252:                        tmp0[9]++;
                    253:                while((creat(tmp0, 0400))<0) {
                    254:                        if (tmp0[9]=='z') {
                    255:                                error("11cc: cannot create temp", (char *)NULL);
                    256:                                exit(1);
                    257:                        }
                    258:                        tmp0[9]++;
                    259:                }
                    260:        }
                    261:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                    262:                signal(SIGINT, idexit);
                    263:        if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
                    264:                signal(SIGTERM, idexit);
                    265:        (tmp1 = copy(tmp0))[8] = '1';
                    266:        (tmp2 = copy(tmp0))[8] = '2';
                    267:        (tmp3 = copy(tmp0))[8] = '3';
                    268:        if (oflag)
                    269:                (tmp5 = copy(tmp0))[8] = '5';
                    270:        if (pflag==0)
                    271:                (tmp4 = copy(tmp0))[8] = '4';
                    272:        if (Fflag) {            /* mjm */
                    273:                (tmp6 = copy(tmp0))[8] = '6';   /* mjm */
                    274:                (tmp7 = copy(tmp0))[8] = '7';   /* mjm */
                    275:        }
                    276:        pvt = pv;
                    277:        for (i=0; i<nc; i++) {
                    278:                if (nc>1)
                    279:                        printf("%s:\n", clist[i]);
                    280:                if (getsuf(clist[i])=='s') {
                    281:                        assource = clist[i];
                    282:                        goto assemble;
                    283:                } 
                    284:                else
                    285:                        assource = tmp3;
                    286:                if (pflag)
                    287:                        tmp4 = setsuf(clist[i], 'i');
                    288:                av[0] = "cpp";
                    289:                av[1] = clist[i];
                    290:                av[2] = exflag ? "-" : tmp4;
                    291:                if(Fflag)
                    292:                        av[2] = tmp6;   /* mjm */
                    293:                na = 3;
                    294:                for(pv=ptemp; pv <pvt; pv++)
                    295:                        if(!Fflag || *(*pv+1) != 'P')   /* mjm */
                    296:                        av[na++] = *pv;         /* mjm: no -P when -F */
                    297:                av[na++] = "-Uvax";     /*god: (5/23) get rid of vax define */
                    298:                av[na++] = "-Dpdp11=1"; /*god: (5/23) and define pdp11 */
                    299:                av[na++]=0;
                    300:                if (callsys(passp, av)) {
                    301:                        cflag++;
                    302:                        eflag++;
                    303:                        continue;
                    304:                }
                    305:                if(Fflag) {             /* mjm */
                    306:                        av[0] = "fpp";
                    307:                        av[1] = tmp6;
                    308:                        av[2] = tmp4;
                    309:                        av[3] = tmp7;
                    310:                        av[4] = rhopt;
                    311:                        av[5] = 0;
                    312:                        if (callsys(passf, av)) {       /* mjm */
                    313:                                eflag++;
                    314:                                continue;
                    315:                        }
                    316:                }
                    317:                av[0]= "11c0";          /*god*/
                    318:                if (pflag) {
                    319:                        cflag++;
                    320:                        continue;
                    321:                }
                    322:                j = 1;
                    323:                if (zflag)
                    324:                        av[j++] = "-u";
                    325:                av[j++] = tmp4;
                    326:                av[j++] = tmp1;
                    327:                av[j++] = tmp2;
                    328:                if (proflag)
                    329:                        av[j++] = "-P";
                    330:                av[j++] = 0;
                    331:                if (callsys(pass0, av)) {
                    332:                        cflag++;
                    333:                        eflag++;
                    334:                        continue;
                    335:                }
                    336:                av[0] = "11c1";         /*god*/
                    337:                av[1] = tmp1;
                    338:                av[2] = tmp2;
                    339:                if (sflag)
                    340:                        assource = tmp3 = setsuf(clist[i], 's');
                    341:                av[3] = tmp3;
                    342:                if (oflag)
                    343:                        av[3] = tmp5;
                    344:                av[4] = 0;
                    345:                if(callsys(pass1, av)) {
                    346:                        cflag++;
                    347:                        eflag++;
                    348:                        continue;
                    349:                }
                    350:                if (oflag) {
                    351:                        av[0] = "11c2"; /*god*/
                    352:                        av[1] = tmp5;
                    353:                        av[2] = tmp3;
                    354:                        av[3] = 0;
                    355:                        if (callsys(pass2, av)) {
                    356:                                unlink(tmp3);
                    357:                                assource = tmp5;
                    358:                        } 
                    359:                        else
                    360:                                unlink(tmp5);
                    361:                }
                    362:                if (sflag)
                    363:                        continue;
                    364: assemble:
                    365:                av[0] = "11as";         /*god*/
                    366:                av[1] = "-u";
                    367:                av[2] = "-o";
                    368:                av[3] = setsuf(clist[i], 'o');
                    369:                av[4] = assource;
                    370:                av[5] = 0;
                    371:                cunlink(tmp1);
                    372:                cunlink(tmp2);
                    373:                cunlink(tmp4);
                    374:                if (callsys(BINPATH(11as), av) > 1) {   /*god*/
                    375:                        cflag++;
                    376:                        eflag++;
                    377:                        continue;
                    378:                }
                    379:        }
                    380: nocom:
                    381:        if (cflag==0 && nl!=0) {
                    382:                i = 0;
                    383:                av[0] = "11ld";                 /*god*/
                    384:                av[1] = "-X";
                    385:                av[2] = pref;
                    386:                j = 3;
                    387:                if (outfile) {
                    388:                        av[j++] = "-o";
                    389:                        av[j++] = outfile;
                    390:                }
                    391:                while(i<nl)
                    392:                        av[j++] = llist[i++];
                    393:                av[j++] = 0;
                    394:                eflag |= callsys(BINPATH(11ld), av);    /*god*/
                    395:                if (nc==1 && nxo==1 && eflag==0)
                    396:                        cunlink(setsuf(clist[0], 'o'));
                    397:        }
                    398:        dexit();
                    399: }
                    400: 
                    401: idexit()
                    402: {
                    403:        eflag = 100;
                    404:        dexit();
                    405: }
                    406: 
                    407: dexit()
                    408: {
                    409:        if (!pflag) {
                    410:                cunlink(tmp1);
                    411:                cunlink(tmp2);
                    412:                if (sflag==0)
                    413:                        cunlink(tmp3);
                    414:                cunlink(tmp4);
                    415:                cunlink(tmp5);
                    416:                cunlink(tmp0);
                    417:        }
                    418:        if(Fflag) {             /* mjm */
                    419:                cunlink(tmp6);
                    420:                cunlink(tmp7);
                    421:                cunlink(tmp0);
                    422:        }
                    423:        exit(eflag);
                    424: }
                    425: 
                    426: error(s, x)
                    427: char *s, *x;
                    428: {
                    429:        fprintf(exflag?stderr:stdout, s, x);
                    430:        putc('\n', exflag? stderr : stdout);
                    431:        cflag++;
                    432:        eflag++;
                    433: }
                    434: 
                    435: 
                    436: 
                    437: 
                    438: getsuf(as)
                    439: char as[];
                    440: {
                    441:        register int c;
                    442:        register char *s;
                    443:        register int t;
                    444: 
                    445:        s = as;
                    446:        c = 0;
                    447:        while(t = *s++)
                    448:                if (t=='/')
                    449:                        c = 0;
                    450:                else
                    451:                        c++;
                    452:        s -= 3;
                    453:        if (c<=14 && c>2 && *s++=='.')
                    454:                return(*s);
                    455:        return(0);
                    456: }
                    457: 
                    458: char *
                    459: setsuf(as, ch)
                    460: char *as;
                    461: {
                    462:        register char *s, *s1;
                    463: 
                    464:        s = s1 = copy(as);
                    465:        while(*s)
                    466:                if (*s++ == '/')
                    467:                        s1 = s;
                    468:        s[-1] = ch;
                    469:        return(s1);
                    470: }
                    471: 
                    472: callsys(f, v)
                    473: char f[], *v[]; 
                    474: {
                    475:        int t, status;
                    476:        register char **vp;     /* god */
                    477: 
                    478:        if(vflag) {     /* god & mjm */
                    479:                vp = v;
                    480:                fprintf(stderr,"+ ");
                    481:                while (*vp)
                    482:                        fprintf(stderr,"%s ",*vp++);
                    483:                fprintf(stderr, "\n");
                    484:        }
                    485: 
                    486:        if ((t=fork())==0) {
                    487:                execv(f, v);
                    488:                printf("Can't find %s\n", f);
                    489:                exit(100);
                    490:        } else
                    491:                if (t == -1) {
                    492:                        printf("Try again\n");
                    493:                        return(100);
                    494:                }
                    495:        while(t!=wait(&status))
                    496:                ;
                    497:        if (t = status&0377) {
                    498:                if (t!=SIGINT) {
                    499:                        printf("Fatal error (%d) in %s\n", t,f); /*mjm*/
                    500:                        eflag = 8;
                    501:                }
                    502:                dexit();
                    503:        }
                    504:        return((status>>8) & 0377);
                    505: }
                    506: 
                    507: char *
                    508: copy(s)
                    509: register char *s;
                    510: {
                    511:        register char *ns;
                    512: 
                    513:        ns = stralloc(strlen(s));
                    514:        return(strcpy(ns, s));
                    515: }
                    516: 
                    517: char *
                    518: stralloc(n)
                    519: {
                    520:        char *malloc();
                    521:        register char *s;
                    522: 
                    523:        s = malloc(n+1);
                    524:        if (s==NULL) {
                    525:                error("out of space", (char *)NULL);
                    526:                dexit();
                    527:        }
                    528: }
                    529: 
                    530: nodup(l, os)
                    531: char **l, *os;
                    532: {
                    533:        register char *t, *s;
                    534:        register int c;
                    535: 
                    536:        s = os;
                    537:        if (getsuf(s) != 'o')
                    538:                return(1);
                    539:        while(t = *l++) {
                    540:                while(c = *s++)
                    541:                        if (c != *t++)
                    542:                                break;
                    543:                if (*t=='\0' && c=='\0')
                    544:                        return(0);
                    545:                s = os;
                    546:        }
                    547:        return(1);
                    548: }
                    549: 
                    550: cunlink(f)
                    551: char *f;
                    552: {
                    553:        if (f==NULL)
                    554:                return;
                    555:        unlink(f);
                    556: }

unix.superglobalmegacorp.com

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