Annotation of researchv9/jerq/sgs/3cc.c, revision 1.1

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

unix.superglobalmegacorp.com

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