Annotation of researchv9/cmd/sun/cc.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)cc.c 1.1 86/02/03 SMI"; /* from UCB 4.7 83/07/01 */
                      3: #endif
                      4: /*
                      5:  * cc - front end for C compiler
                      6:  */
                      7: #include <sys/param.h>
                      8: #include <stdio.h>
                      9: #include <ctype.h>
                     10: #include <signal.h>
                     11: #include <sys/dir.h>
                     12: 
                     13: char   *cpp = "/lib/cpp";
                     14: char   *count = "/usr/lib/bb_count";
                     15: char   *ccom = "/lib/ccom";
                     16: char   *c2 = "/lib/c2";
                     17: char   *as = "/bin/as";
                     18: char   *ld = "/bin/ld";
                     19: char   *libc = "-lc";
                     20: char   *crt0 = "/lib/crt0.o";
                     21: char   *gcrt0 = "/lib/gcrt0.o";
                     22: char   *mcrt0 = "/lib/mcrt0.o";
                     23: 
                     24: char   tmp0[30];               /* big enough for /tmp/ctm%05.5d */
                     25: char   *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6;
                     26: char   *outfile;
                     27: char   *savestr(), *strspl(), *setsuf();
                     28: int    idexit();
                     29: char   **av, **clist, **llist, **plist;
                     30: int    cflag, eflag, oflag, pflag, sflag, wflag, Rflag, exflag, proflag;
                     31: int    aflag;
                     32: int    gproflag, gflag, Gflag;
                     33: int    vflag;
                     34: 
                     35: /*
                     36:  * Added to support NRTX
                     37:  */
                     38: char   *libdir;
                     39: char   *expandlib();
                     40: int nrtxflag;
                     41: int nofloatcrtflag;
                     42: #ifdef mc68000
                     43: 
                     44: /*
                     45:  * starting in release 3.0, we must figure out what kind of processor
                     46:  * we are running on, and generate code accordingly.  This requires
                     47:  * some magic routines from libc.a
                     48:  */
                     49: int    is68020();      /* returns 1 if the host is a 68020 */
                     50: 
                     51: struct mach_info { 
                     52:        char *optname; 
                     53:        int  found; 
                     54:        int  isatype;
                     55:        char *crt1;
                     56: };
                     57: 
                     58: struct mach_info machopts[] = {
                     59:        "-m68010",   0, 1,  (char*)0,   /* use 68010 subset */
                     60:        "-m68020",   0, 1,  (char*)0,   /* use 68020 extensions */
                     61:        (char*)0
                     62: };
                     63: 
                     64: struct mach_info floatopts[] = {
                     65:        "", /*fpa*/  0, 1,  "Wcrt1.o",  /* sun fpa */
                     66:        "-f68881",   0, 1,  "Mcrt1.o",  /* 68881 */
                     67:        "-fsky",     0, 1,  "Scrt1.o",  /* sky board */
                     68:        "-fsoft",    0, 1,  "Fcrt1.o",  /* software floating point */
                     69:        "-fswitch",  0, 1,  (char*)0,   /* switched floating point */
                     70:        "-fsingle",  0, 0,  (char*)0,   /* single precision float */
                     71:        "-fsingle2", 0, 0,  (char*)0,   /* pass float args as floats */
                     72:        (char *)0 ,
                     73: };
                     74: 
                     75: extern char *getenv();
                     76: char *FLOAT_OPTION = "FLOAT_OPTION";
                     77: struct mach_info *machtype=NULL;       /* selected target machine type */
                     78: struct mach_info *fptype=NULL;         /* selected floating pt machine type */
                     79: struct mach_info *default_machtype();  /* default target machine type */
                     80: struct mach_info *default_fptype();    /* default floating point machine */
                     81: 
                     82: #define M_68010  &machopts[0]
                     83: #define M_68020  &machopts[1]
                     84: #define F_fpa    &floatopts[0]
                     85: #define F_68881  &floatopts[1]
                     86: #define F_sky    &floatopts[2]
                     87: #define F_soft   &floatopts[3]
                     88: #define F_switch &floatopts[4]
                     89: 
                     90: #define use68010  (machtype == M_68010)
                     91: #define use68020  (machtype == M_68020)
                     92: 
                     93: #define unsupported(machtype, fptype) \
                     94:        ( machtype == M_68010 && fptype == F_fpa \
                     95:        || machtype == M_68020 && fptype == F_sky )
                     96: 
                     97: #endif
                     98: char   *dflag;
                     99: int    exfail;
                    100: char   *chpass;
                    101: char   *npassname;
                    102: char   *ccname;
                    103: 
                    104: int    nc, nl, np, nxo, na;
                    105: 
                    106: #define        cunlink(s)      if (s) unlink(s)
                    107: 
                    108: main(argc, argv)
                    109:        register int argc;
                    110:        register char **argv;
                    111: {
                    112:        char *t;
                    113:        char *assource;
                    114:        register int i, j, c, tmpi;
                    115:        register struct mach_info *mp;
                    116:        int optfound;
                    117: 
                    118:        /* ld currently adds upto 5 args; 10 is room to spare */
                    119:        av = (char **)calloc(argc+20, sizeof (char **));
                    120:        clist = (char **)calloc(argc, sizeof (char **));
                    121:        llist = (char **)calloc(argc, sizeof (char **));
                    122:        plist = (char **)calloc(argc, sizeof (char **));
                    123:        ccname = argv[0];
                    124:        for (i = 1; i < argc; i++) {
                    125:                if (*argv[i] == '-') switch (argv[i][1]) {
                    126: 
                    127:                case 'S':
                    128:                        sflag++;
                    129:                        cflag++;
                    130:                        continue;
                    131:                case 'o':
                    132:                        if (++i < argc) {
                    133:                                outfile = argv[i];
                    134:                                switch (getsuf(outfile)) {
                    135: 
                    136:                                case 'c':
                    137:                                case 'o':
                    138:                                        error("-o would overwrite %s",
                    139:                                            outfile);
                    140:                                        exit(8);
                    141:                                }
                    142:                        }
                    143:                        continue;
                    144:                case 'R':
                    145:                        Rflag++;
                    146:                        continue;
                    147:                case 'O':
                    148:                        /*
                    149:                         * There might be further chars after -O; we just
                    150:                         * pass them on to c2 as an extra argument -- later.
                    151:                         */
                    152:                        oflag++;
                    153:                        continue;
                    154:                case 'p':
                    155:                        proflag++;
                    156:                        if (argv[i][2] == 'g'){
                    157:                                crt0 = gcrt0;
                    158:                                gproflag++;
                    159:                        } else {
                    160:                                crt0 = mcrt0;
                    161:                        }
                    162:                        continue;
                    163:                case 'g':
                    164:                        if (argv[i][2] == 'o') {
                    165:                            Gflag++;    /* old format for -go */
                    166:                        } else {
                    167:                            gflag++;    /* new format for -g */
                    168:                        }
                    169:                        continue;
                    170:                case 'w':
                    171:                        wflag++;
                    172:                        continue;
                    173:                case 'E':
                    174:                        exflag++;
                    175:                case 'P':
                    176:                        pflag++;
                    177:                        if (argv[i][1]=='P')
                    178:                                fprintf(stderr,
                    179:        "%s: warning: -P option obsolete; you should use -E instead\n", ccname);
                    180:                        plist[np++] = argv[i];
                    181:                case 'c':
                    182:                        cflag++;
                    183:                        continue;
                    184:                case 'D':
                    185:                case 'I':
                    186:                case 'U':
                    187:                case 'C':
                    188:                        plist[np++] = argv[i];
                    189:                        continue;
                    190:                case 't':
                    191:                        if (chpass)
                    192:                                error("-t overwrites earlier option", 0);
                    193:                        chpass = argv[i]+2;
                    194:                        if (chpass[0]==0)
                    195:                                chpass = "012palc";
                    196:                        continue;
                    197:                case 'f':
                    198: #ifdef mc68000
                    199:                        /*
                    200:                         * floating point option switches
                    201:                         */
                    202:                        optfound = 0;
                    203:                        for (mp = floatopts; mp->optname; mp++) {
                    204:                            if (!strcmp(argv[i], mp->optname)){
                    205:                                if (mp->isatype) {
                    206:                                    if (fptype != NULL && fptype != mp) {
                    207:                                        error("%s overwrites earlier option",
                    208:                                            mp->optname);
                    209:                                    }
                    210:                                    fptype = mp;
                    211:                                } else {
                    212:                                    mp->found = 1;
                    213:                                }
                    214:                                optfound = 1;
                    215:                                break;
                    216:                            }
                    217:                        }
                    218:                        if (!optfound) {
                    219:                            if (argv[i][2] == '\0') {
                    220:                                fprintf(stderr,
                    221:                                    "%s: warning: -f option is obsolete\n",
                    222:                                    ccname);
                    223:                            } else {
                    224:                                fprintf(stderr,
                    225:                                    "%s: warning: %s option not recognized\n",
                    226:                                    ccname, argv[i]);
                    227:                            }
                    228:                        }
                    229:                        continue;
                    230: #else !mc68000
                    231:                        fprintf(stderr,
                    232:                            "%s: warning: -f option is obsolete\n",
                    233:                            ccname);
                    234:                        continue;
                    235: #endif !mc68000
                    236: 
                    237: #ifdef mc68000
                    238:                case 'm':
                    239:                        optfound = 0;
                    240:                        for (mp = machopts; mp->optname; mp++) {
                    241:                            if (!strcmp(argv[i], mp->optname)) {
                    242:                                if (mp->isatype) {
                    243:                                    if (machtype != NULL && machtype != mp) {
                    244:                                        error("%s overwrites earlier option",
                    245:                                            mp->optname);
                    246:                                    }
                    247:                                    machtype = mp;
                    248:                                } else {
                    249:                                    mp->found = 1;
                    250:                                }
                    251:                                optfound = 1;
                    252:                                break;
                    253:                            }
                    254:                        }
                    255:                        if (!optfound) {
                    256:                            fprintf(stderr,
                    257:                                "%s: warning: %s option not recognized\n",
                    258:                                ccname, argv[i]);
                    259:                        }
                    260:                        continue;
                    261: #endif mc68000
                    262: 
                    263:                case 'B':
                    264:                        if (npassname)
                    265:                                error("-B overwrites earlier option", 0);
                    266:                        npassname = argv[i]+2;
                    267:                        if (npassname[0]==0)
                    268:                                npassname = "/usr/c/o";
                    269:                        continue;
                    270:                case 'd':
                    271:                        dflag = argv[i];
                    272:                        continue;
                    273:                case 'a':
                    274:                        aflag++;
                    275:                        continue;
                    276:                case 'A':
                    277:                        /*
                    278:                         * There might be further chars after -A; we just
                    279:                         * pass them on to c2 as an extra argument -- later.
                    280:                         */
                    281:                        continue;
                    282:                case 'v':
                    283:                        vflag++;
                    284:                        continue;
                    285:                /*
                    286:                 * Local Options
                    287:                 * added by D.A. Kapilow  12/3/86 to support NRTX
                    288:                 * libraries and startoff files
                    289:                 */
                    290:                case 'L':
                    291:                        /*
                    292:                         * Change path for -l
                    293:                         */
                    294:                        if (argv[i][2] == 'p') {
                    295:                                libdir = &argv[i][3];
                    296:                        }
                    297:                        /*
                    298:                         * Change default crt0.o
                    299:                         */
                    300:                        else if (argv[i][2] == 's') {
                    301:                                crt0 = &argv[i][3];
                    302:                        }
                    303:                        /*
                    304:                         * Set nrtxflag to avoid pulling in crt1.o with -f
                    305:                         */
                    306:                        else if (argv[i][2] == 'n') {
                    307:                                nrtxflag++;
                    308:                        }
                    309:                        /*
                    310:                         * Set nofloatcrtflag to avoid pulling in crt1.o
                    311:                         * when not using NRTX.  Kludge used for cross
                    312:                         * development of version 9.
                    313:                         */
                    314:                        else if (argv[i][2] == 'f') {
                    315:                                nofloatcrtflag++;
                    316:                        }
                    317:                        continue;
                    318:                }
                    319:                t = argv[i];
                    320:                c = getsuf(t);
                    321:                if (c=='c' || c=='s' || c=='i' || exflag) {
                    322:                        clist[nc++] = t;
                    323:                        t = setsuf(t, 'o');
                    324:                }
                    325:                if (libdir && t[0] == '-' && t[1] == 'l') {
                    326:                        t = expandlib(libdir, &t[2]);
                    327:                }
                    328:                if (nodup(llist, t)) {
                    329:                        llist[nl++] = t;
                    330:                        if (getsuf(t)=='o')
                    331:                                nxo++;
                    332:                }
                    333:        }
                    334:        if (gflag || Gflag) {
                    335:                if (oflag)
                    336:                        fprintf(stderr, "%s: warning: -g disables -O\n", ccname);
                    337:                oflag = 0;
                    338:        }
                    339: #ifdef mc68000
                    340:        /*
                    341:         * if no machine type specified, use the default
                    342:         */
                    343:        if (machtype == NULL) {
                    344:                machtype = default_machtype();
                    345:        }
                    346:        /*
                    347:         * if no floating point machine type specified, use the default
                    348:         */
                    349:        if (fptype == NULL) {
                    350:                fptype = default_fptype(machtype);
                    351:        } else if (unsupported(machtype, fptype)) {
                    352:                t = fptype->optname;
                    353:                fptype = default_fptype(machtype);
                    354:                fprintf(stderr,
                    355:                    "%s: warning: %s option not supported with %s; %s used\n",
                    356:                    ccname, t, machtype->optname, fptype->optname);
                    357:        }
                    358:        machtype->found = 1;
                    359:        fptype->found = 1;
                    360: #endif mc68000
                    361: 
                    362:        if (npassname && chpass ==0)
                    363:                chpass = "012palc";
                    364:        if (chpass && npassname==0)
                    365:                npassname = "/usr/new/";
                    366:        if (chpass)
                    367:        for (t=chpass; *t; t++) {
                    368:                switch (*t) {
                    369: 
                    370:                case '0':
                    371:                case '1':
                    372:                        ccom = strspl(npassname, "ccom");
                    373:                        continue;
                    374:                case '2':
                    375:                        c2 = strspl(npassname, "c2");
                    376:                        continue;
                    377:                case 'p':
                    378:                        cpp = strspl(npassname, "cpp");
                    379:                        continue;
                    380:                case 'a':
                    381:                        as = strspl(npassname, "as");
                    382:                        continue;
                    383:                case 'l':
                    384:                        ld = strspl(npassname, "ld");
                    385:                        continue;
                    386:                case 'c':
                    387:                        libc = strspl(npassname, "libc.a");
                    388:                        continue;
                    389:                }
                    390:        }
                    391:        if (nc==0)
                    392:                goto nocom;
                    393:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                    394:                signal(SIGINT, idexit);
                    395:        if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
                    396:                signal(SIGTERM, idexit);
                    397:        if (pflag==0)
                    398:                sprintf(tmp0, "/tmp/ctm%05.5d", getpid());
                    399:        tmp1 = strspl(tmp0, "1");
                    400:        tmp2 = strspl(tmp0, "2");
                    401:        tmp3 = strspl(tmp0, "3");
                    402:        if (pflag==0)
                    403:                tmp4 = strspl(tmp0, "4");
                    404:        if (oflag)
                    405:                tmp5 = strspl(tmp0, "5");
                    406:        for (i=0; i<nc; i++) {
                    407:                int suffix = getsuf(clist[i]);
                    408:                if (nc > 1) {
                    409:                        printf("%s:\n", clist[i]);
                    410:                        fflush(stdout);
                    411:                }
                    412:                if (suffix == 's') {
                    413:                        assource = clist[i];
                    414:                        goto assemble;
                    415:                } else
                    416:                        assource = tmp3;
                    417:                if (suffix == 'i')
                    418:                        goto compile;
                    419:                if (pflag)
                    420:                        tmp4 = setsuf(clist[i], 'i');
                    421:                av[0] = "cpp"; av[1] = clist[i]; av[2] = exflag ? "-" : tmp4;
                    422:                na = 3;
                    423:                for (j = 0; j < np; j++)
                    424:                        av[na++] = plist[j];
                    425:                av[na++] = 0;
                    426:                if (callsys(cpp, av)) {
                    427:                        exfail++;
                    428:                        eflag++;
                    429:                }
                    430:                if (pflag || exfail) {
                    431:                        cflag++;
                    432:                        continue;
                    433:                }
                    434: compile:
                    435: 
                    436:                /*
                    437:                 * Call the bb_count preprocessor
                    438:                 */
                    439:                if (aflag) {
                    440:                        tmp6 = strspl(tmp0, "6");
                    441:                        av[0] = "bb_count";
                    442:                        av[1] = tmp4;
                    443:                        av[2] = clist[i];
                    444:                        av[3] = tmp6;
                    445:                        av[4] = 0;
                    446:                        if (callsys(count, av)) {
                    447:                                exfail++;
                    448:                                eflag++;
                    449:                        }
                    450:                        if (pflag || exfail) {
                    451:                                cflag++;
                    452:                                continue;
                    453:                        }
                    454:                }
                    455:                if (sflag)
                    456:                        assource = tmp3 = setsuf(clist[i], 's');
                    457:                av[0] = "ccom"; 
                    458:                av[1] = aflag? tmp6: (suffix=='i'? clist[i] : tmp4); 
                    459:                av[2] = oflag? tmp5: tmp3; 
                    460:                na = 3;
                    461:                if (proflag)
                    462:                        av[na++] = "-XP";
                    463:                if (gflag) {
                    464:                        av[na++] = "-Xg";
                    465:                } else if (Gflag) { 
                    466:                        av[na++] = "-XG"; 
                    467:                } if (wflag)
                    468:                        av[na++] = "-w";
                    469: #ifdef mc68000
                    470:                /* pass code gen options to ccom */
                    471:                for (mp = machopts; mp->optname; mp++) {
                    472:                    if (mp->found) {
                    473:                        av[na++] = mp->optname;
                    474:                    }
                    475:                }
                    476:                for (mp = floatopts; mp->optname; mp++) {
                    477:                    if (mp->found) {
                    478:                        av[na++] = mp->optname;
                    479:                    }
                    480:                }
                    481: #endif
                    482:                av[na] = 0;
                    483:                if (callsys(ccom, av)) {
                    484:                        cflag++;
                    485:                        eflag++;
                    486:                        continue;
                    487:                }
                    488:                if (oflag) {
                    489:                        av[0] = "c2"; av[1] = tmp5; av[2] = tmp3; na = 3;
                    490:                        av[na++] = (use68020 ? "-20" : "-10");
                    491:                        /* Pass -Oxxx arguments to optimizer */
                    492:                        for (tmpi = 1; tmpi < argc; tmpi++) {
                    493:                                if (argv[tmpi][0] == '-'
                    494:                                 && argv[tmpi][1] == 'O'
                    495:                                 && argv[tmpi][2] != '\0') {
                    496:                                        av[na++] = argv[tmpi]+2;
                    497:                                }
                    498:                        }
                    499:                        av[na] = 0;
                    500:                        if (callsys(c2, av)) {
                    501:                                unlink(tmp3);
                    502:                                tmp3 = assource = tmp5;
                    503:                        } else
                    504:                                unlink(tmp5);
                    505:                }
                    506:                if (sflag)
                    507:                        continue;
                    508:        assemble:
                    509:                cunlink(tmp1); cunlink(tmp2); cunlink(tmp4);
                    510:                av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o');
                    511:                na = 3;
                    512:                av[na++] = (use68020 ? "-20" : "-10");
                    513:                if (Rflag)
                    514:                        av[na++] = "-R";
                    515:                if (dflag)
                    516:                        av[na++] = dflag;
                    517:                /* Pass -Axxx arguments to assembler */
                    518:                for (tmpi = 1; tmpi < argc; tmpi++) {
                    519:                        if (argv[tmpi][0] == '-'
                    520:                         && argv[tmpi][1] == 'A'
                    521:                         && argv[tmpi][2] != '\0') {
                    522:                                av[na++] = argv[tmpi]+2;
                    523:                        }
                    524:                }
                    525:                av[na++] = assource;
                    526:                av[na] = 0;
                    527:                if (callsys(as, av) > 1) {
                    528:                        cflag++;
                    529:                        eflag++;
                    530:                        continue;
                    531:                }
                    532:        }
                    533: nocom:
                    534:        if (cflag==0 && nl!=0) {
                    535:                i = 0;
                    536:                na = 0;
                    537:                av[na++] = "ld";
                    538:                av[na++] = "-X";
                    539:                if (nrtxflag) {
                    540:                        av[na++] = "-r";
                    541:                        av[na++] = "-d";
                    542:                }
                    543:                av[na++] = crt0;
                    544: /*
                    545:                if (fptype->crt1 != NULL && !nrtxflag && !nofloatcrtflag) {
                    546:                        av[na++] = strspl("/lib/", fptype->crt1);
                    547:                }
                    548: */
                    549:                if (outfile) {
                    550:                        av[na++] = "-o";
                    551:                        av[na++] = outfile;
                    552:                }
                    553:                while (i < nl)
                    554:                        av[na++] = llist[i++];
                    555:                if (aflag) 
                    556:                        av[na++] = "/usr/lib/bb_link.o";
                    557:                if (gflag || Gflag) {
                    558:                        if (libdir)
                    559:                                av[na++] = expandlib(libdir, "g");
                    560:                        else
                    561:                                av[na++] = "-lg";
                    562:                }
                    563:                if (proflag) {
                    564:                        if (libdir)
                    565:                                av[na++] = expandlib(libdir, "c_p");
                    566:                        else
                    567:                                av[na++] = "-lc_p";
                    568:                }
                    569:                else {
                    570:                        if (libdir && libc[0] == '-' && libc[1] == 'l')
                    571:                                av[na++] = expandlib(libdir, &libc[2]);
                    572:                        else
                    573:                                av[na++] = libc;
                    574:                }
                    575:                av[na++] = 0;
                    576:                eflag |= callsys(ld, av);
                    577:                if (nc==1 && nxo==1 && eflag==0)
                    578:                        unlink(setsuf(clist[0], 'o'));
                    579:        }
                    580:        dexit();
                    581: }
                    582: 
                    583: #ifdef mc68000
                    584: 
                    585: /*
                    586:  * default target machine type is the same as host
                    587:  */
                    588: struct mach_info *
                    589: default_machtype()
                    590: {
                    591:     return (is68020()? M_68020 : M_68010);
                    592: }
                    593: 
                    594: /*
                    595:  *  Floating point is such a zoo on this machine that
                    596:  *  nobody agrees what the default should be.  So let
                    597:  *  the user decide, and to hell with it.
                    598:  */
                    599: struct mach_info *
                    600: default_fptype(mtp)
                    601:     struct mach_info *mtp;
                    602: {
                    603:     register char *env_string;
                    604:     register struct mach_info *ftp;
                    605: 
                    606:     env_string = getenv(FLOAT_OPTION);
                    607:     if (env_string == NULL) {
                    608:        return (F_soft);
                    609:     }
                    610:     for(ftp = floatopts; ftp->isatype; ftp++) {
                    611:        if (!strcmp(ftp->optname+1, env_string)) {
                    612:            if (unsupported(mtp, ftp)) {
                    613:                ftp = F_soft;
                    614:                fprintf(stderr,
                    615:                "%s: warning: FLOAT_OPTION=%s not supported with %s; %s used\n",
                    616:                    ccname, env_string, mtp->optname+1, ftp->optname+1);
                    617:            }
                    618:            return(ftp);
                    619:        }
                    620:     }
                    621:     ftp = F_soft;
                    622:     fprintf(stderr,
                    623:        "%s: warning: FLOAT_OPTION=%s not recognized; %s used\n",
                    624:        ccname, env_string, ftp->optname+1);
                    625:     return(ftp);
                    626: }
                    627: 
                    628: #endif mc68000
                    629: 
                    630: idexit()
                    631: {
                    632: 
                    633:        eflag = 100;
                    634:        dexit();
                    635: }
                    636: 
                    637: dexit()
                    638: {
                    639: 
                    640:        if (!pflag) {
                    641:                cunlink(tmp1);
                    642:                cunlink(tmp2);
                    643:                if (sflag==0)
                    644:                        cunlink(tmp3);
                    645:                cunlink(tmp4);
                    646:                cunlink(tmp5);
                    647:                cunlink(tmp6);
                    648:        }
                    649:        exit(eflag);
                    650: }
                    651: 
                    652: /*VARARGS1*/
                    653: error(s, x1, x2, x3, x4)
                    654:        char *s;
                    655: {
                    656:        FILE *diag = exflag ? stderr : stdout;
                    657: 
                    658:        fprintf(diag, "%s: ", ccname);
                    659:        fprintf(diag, s, x1, x2, x3, x4);
                    660:        putc('\n', diag);
                    661:        exfail++;
                    662:        cflag++;
                    663:        eflag++;
                    664: }
                    665: 
                    666: getsuf(as)
                    667: char as[];
                    668: {
                    669:        register int c;
                    670:        register char *s;
                    671:        register int t;
                    672: 
                    673:        s = as;
                    674:        c = 0;
                    675:        while (t = *s++)
                    676:                if (t=='/')
                    677:                        c = 0;
                    678:                else
                    679:                        c++;
                    680:        s -= 3;
                    681:        if (c <= DIRSIZ && c > 2 && *s++ == '.')
                    682:                return (*s);
                    683:        return (0);
                    684: }
                    685: 
                    686: char *
                    687: setsuf(as, ch)
                    688:        char *as;
                    689: {
                    690:        register char *s, *s1;
                    691: 
                    692:        s = s1 = savestr(as);
                    693:        while (*s)
                    694:                if (*s++ == '/')
                    695:                        s1 = s;
                    696:        s[-1] = ch;
                    697:        return (s1);
                    698: }
                    699: 
                    700: callsys(f, v)
                    701:        char *f, **v;
                    702: {
                    703:        int t, status;
                    704: 
                    705: #ifdef DEBUG
                    706:        printf("fork %s:", f);
                    707:        for (t = 0; v[t]; t++) printf(" %s", v[t][0]? v[t]: "(empty)");
                    708:        printf("\n");
                    709:        return 0;
                    710: #else  DEBUG
                    711:        if (vflag){
                    712:                fprintf(stderr,"%s: ",f);
                    713:                for (t = 0; v[t]; t++) fprintf(stderr, " %s", v[t][0]? v[t]: "(empty)");
                    714:                fprintf(stderr, "\n");
                    715:        }
                    716:        fflush(stderr); /* purge any junk before the vfork */
                    717:        t = vfork();
                    718:        if (t == -1) {
                    719:                fprintf( stderr, "%s: No more processes\n", ccname);
                    720:                return (100);
                    721:        }
                    722:        if (t == 0) {
                    723:                execv(f, v);
                    724:                /*
                    725:                 * We are now in The Vfork Zone, and can't use "fprintf".
                    726:                 * We use "write" and "_perror" instead.
                    727:                 */
                    728:                write(2, ccname, strlen(ccname));
                    729:                write(2, ": Can't execute ", 16);
                    730:                perror(f);
                    731:                _exit(100);
                    732:        }
                    733:        while (t != wait(&status))
                    734:                ;
                    735:        if ((t=(status&0377)) != 0 && t!=14) {
                    736:                if (t!=2) {
                    737:                        fprintf( stderr, "%s: Fatal error in %s\n", ccname, f);
                    738:                        eflag = 8;
                    739:                }
                    740:                dexit();
                    741:        }
                    742:        return ((status>>8) & 0377);
                    743: #endif DEBUG
                    744: }
                    745: 
                    746: nodup(l, os)
                    747:        char **l, *os;
                    748: {
                    749:        register char *t, *s;
                    750:        register int c;
                    751: 
                    752:        s = os;
                    753:        if (getsuf(s) != 'o')
                    754:                return (1);
                    755:        while (t = *l++) {
                    756:                while (c = *s++)
                    757:                        if (c != *t++)
                    758:                                break;
                    759:                if (*t==0 && c==0)
                    760:                        return (0);
                    761:                s = os;
                    762:        }
                    763:        return (1);
                    764: }
                    765: 
                    766: #define        NSAVETAB        1024
                    767: char   *savetab;
                    768: int    saveleft;
                    769: 
                    770: char *
                    771: savestr(cp)
                    772:        register char *cp;
                    773: {
                    774:        register int len;
                    775: 
                    776:        len = strlen(cp) + 1;
                    777:        if (len > saveleft) {
                    778:                saveleft = NSAVETAB;
                    779:                if (len > saveleft)
                    780:                        saveleft = len;
                    781:                savetab = (char *)malloc(saveleft);
                    782:                if (savetab == 0) {
                    783:                        fprintf(stderr, "%s: ran out of memory (savestr)\n", ccname);
                    784:                        exit(1);
                    785:                }
                    786:        }
                    787:        strncpy(savetab, cp, len);
                    788:        cp = savetab;
                    789:        savetab += len;
                    790:        saveleft -= len;
                    791:        return (cp);
                    792: }
                    793: 
                    794: char *
                    795: strspl(left, right)
                    796:        char *left, *right;
                    797: {
                    798:        char buf[BUFSIZ];
                    799: 
                    800:        strcpy(buf, left);
                    801:        strcat(buf, right);
                    802:        return (savestr(buf));
                    803: }
                    804: 
                    805: char *
                    806: expandlib(dir, lib)
                    807:        char *dir, *lib;
                    808: {
                    809:        char buf[BUFSIZ];
                    810: 
                    811:        strcpy(buf, dir);
                    812:        strcat(buf, "/lib");
                    813:        strcat(buf, lib);
                    814:        strcat(buf, ".a");
                    815:        return (savestr(buf));
                    816: }

unix.superglobalmegacorp.com

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