Annotation of coherent/d/bin/cc/c/coh/cc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * cc.c
                      3:  * 11/3/90
                      4:  * CC command.
                      5:  * Compile, assemble and link edit C programs.
                      6:  * A lot of grunge.
                      7:  * Revised by rec may1987 to incorporate all
                      8:  * coherent and gemdos revisions to date.
                      9:  *
                     10:  * Defining VeryVflag will produce very verbose output under -VSTAT
                     11:  *     option
                     12:  *
                     13:  * C compiler/loader switch map.
                     14:  *     *7      marks a version seven documented option.
                     15:  *     *7d     marks a defunct version seven option.
                     16:  *     *7c     marks a changed version seven option.
                     17:  *     *u      marks an option unrecognized by cc, ie passed to linker
                     18:  *             with no interpretation or processing.
                     19:  *
                     20:  *7c   Bstring         use string to find compiler passes
                     21:  *     A               run in auto edit mode
                     22:  *7    Dname[=value]   preprocessor: #define
                     23:  *7    E               run preprocessor to stdout
                     24:  *7    Ipathname       preprocessor: #include search directory
                     25:  *     K               keep intermediate files in name.[P012so]
                     26:  *     L               loader: directive for >64K file sizes
                     27:  *     Mstring         use string as cross-compiler prefix
                     28:  *     N[01ab2sdlrt]string     rename pass with string
                     29:  *7    O               run object code optimiser
                     30:  *7d   P               put preprocessor output into name.i; use -Kqp
                     31:  *     Q               be quiet, make no messages
                     32:  *7    S               make assembly language output in name.s
                     33:  *7    Uname           preprocessor: #undef
                     34:  *     V               be verbose, report everything
                     35:  *     Vvariant        enable variant
                     36:  *     X               loader: remove c generated local symbols
                     37:  *     Z               (GEMDOS) floppy change prompts for phases
                     38:  *7    c               compile but do not load
                     39:  *     d               loader: define common space
                     40:  *7    e name          loader: entry point specification
                     41:  *7c   f               fake floating point operations
                     42:  *7u   i               loader: separate i and d spaces
                     43:  *     k[system]       loader: bind as kernel process
                     44:  *7c   lname           loader: library specification
                     45:  *7u   n               loader: shared instruction space
                     46:  *7    o name          loader: output file name
                     47:  *7    p               generate code to profile function calls
                     48:  *     q[p012s]        quit after specified pass
                     49:  *     r               loader: retain relocation in output
                     50:  *     s               loader: strip symbol table
                     51:  *7c   t[p012adlrt]    take specified passes from -Bdirectory
                     52:  *7    u name          loader: enter name into symbol table
                     53:  *     w               loader: watch
                     54:  *     x               loader: remove local symbols from symbol table
                     55:  */
                     56: #if GEMDOS
                     57: #ifndef VERS
                     58: #define VERS   "2.1"
                     59: #endif
                     60: #endif
                     61: 
                     62: #include <stdio.h>
                     63: #include <ctype.h>
                     64: #include <signal.h>
                     65: #include <path.h>
                     66: #include <errno.h>
                     67: #include "mch.h"
                     68: #undef NONE
                     69: #include "var.h"
                     70: #include "varmch.h"
                     71: 
                     72: #ifndef VeryVflag
                     73: #define VeryVflag 0
                     74: #endif
                     75: 
                     76: #ifndef PREFIX
                     77: #define PREFIX ""
                     78: #endif
                     79: 
                     80: /*
                     81: ** Pass information.
                     82: */
                     83: #define NONE   -1
                     84: #define CPP    0       /* Pass index numbers */
                     85: #define CC0    1
                     86: #define CC1    2
                     87: #define CC2    3
                     88: #define CC3    4
                     89: #define CC4    5       /* Output writer postprocessor */
                     90: #define AS     6
                     91: #define LD     7
                     92: #define LD2    8       /* Loader postprocessor */
                     93: #define ED     9
                     94: #define LIB    10
                     95: #define CRT    11
                     96: #define TMP    12
                     97: #define ALL    13
                     98: 
                     99: #define P_TAKE 1       /* Take pass from backup directory */
                    100: #define P_BACK 2       /* Backup directory specified */
                    101: #define P_LIB  4       /* Take pass from LIBPATH */
                    102: #define P_BIN  8       /* Take pass from BIN */
                    103: 
                    104: #define PTMP   16      /* Pass name buffer size */
                    105: 
                    106: char   dnul[] = "";            /* Global null string */
                    107: char   dmch[PTMP] = PREFIX;    /* Cross compiler prefix */
                    108: 
                    109: struct pass {
                    110:        char p_flag;            /* Flags */
                    111:        char p_psn;             /* Pass short name */
                    112:        char p_pln[PTMP];       /* Pass long name */
                    113:        char p_pfs[4];          /* Pass output file suffix */
                    114:        char *p_ifn;            /* Input file name */
                    115:        char *p_ofn;            /* Output file name */
                    116:        char *p_sfn;            /* Scratch file name */
                    117:        char *p_dir;            /* Path lookup or backup string */
                    118:        char *p_mch;            /* Machine prefix name */
                    119: } pass[] = {
                    120:        { P_LIB, 'p', "cpp",  "i",      NULL, NULL, NULL, NULL, dmch },
                    121:        { P_LIB, '0', "cc0",  "0",      NULL, NULL, NULL, NULL, dmch },
                    122:        { P_LIB, '1', "cc1",  "1",      NULL, NULL, NULL, NULL, dmch },
                    123:        { P_LIB, '2', "cc2",  "o",      NULL, NULL, NULL, NULL, dmch },
                    124:        { P_LIB, '3', "cc3",  "s",      NULL, NULL, NULL, NULL, dmch },
                    125:        { P_LIB, '4', "cc4",  "o",      NULL, NULL, NULL, NULL, dmch },
                    126:        { P_BIN, 's', "as",   "o",      NULL, NULL, NULL, NULL, dmch },
                    127:        { P_BIN, 'd', "ld",   "",       NULL, NULL, NULL, NULL, dnul },
                    128:        { P_BIN, 'x', "ld2",  "",       NULL, NULL, NULL, NULL, dnul },
                    129:        { P_BIN, 'e', "me",   "",       NULL, NULL, NULL, NULL, dnul },
                    130:        { P_LIB, 'l', "lib",  "a",      NULL, NULL, NULL, NULL, dmch },
                    131:        { P_LIB, 'r', "crts0.o", "",    NULL, NULL, NULL, NULL, dmch },
                    132:        {     0, 't', "cc",    "",      NULL, NULL, NULL, NULL, dnul }
                    133: };
                    134: 
                    135: /*
                    136: ** Option and argument information.
                    137: */
                    138: #define CCOPT  0x001           /* Argument flags in argf[] */
                    139: #define PPOPT  0x002           /* Also in option table, at least */
                    140: #define LDOPT  0x004           /* those that fit in a byte */
                    141: #define LD2OPT 0x008
                    142: #define CCLIB  0x010
                    143: #define LDLIB  0x020
                    144: #define CCARG  0x040
                    145: #define ASARG  0x080
                    146: #define MARG   0x100
                    147: #define LDARG  0x200
                    148: 
                    149: #define FLAG_c 1               /* -c flag */
                    150: #define FLAG_O 2               /* -O flag */
                    151: #define FLAG_f 4               /* -f flag */
                    152: #define FLAG_K 010             /* -K or -VKEEP flag */
                    153: #define VS     020             /* Turn on strict messages */
                    154: #define VDB    040             /* Turn on debugging */
                    155: #define FLAG_A 0100            /* Auto edit mode */
                    156: #define FLAG_Z 0200            /* Floppy change prompts */
                    157: #define FLAG_V 0400            /* Verbose flag */
                    158: 
                    159: #define FLAG_GEMAPP    01000   /* Gem application compile */
                    160: #define FLAG_GEMACC    02000   /* Gem accessory compile */
                    161: 
                    162: struct option {                        /* option table */
                    163:        char o_kind;
                    164:        char o_flag;
                    165:        char *o_name;
                    166:        int o_bits;
                    167: } option[] = {
                    168: /* Strict */
                    169:        { 0,    CCOPT,  "VSUREG",       VSUREG  },
                    170:        { 0,    CCOPT,  "VSUVAR",       VSUVAR  },
                    171:        { 0,    CCOPT,  "VSNREG",       VSNREG  },
                    172:        { 0,    CCOPT,  "VSRTVC",       VSRTVC  },
                    173:        { 0,    CCOPT,  "VSMEMB",       VSMEMB  },
                    174:        { 0,    CCOPT,  "VSBOOK",       VSBOOK  },
                    175:        { 0,    CCOPT,  "VSLCON",       VSLCON  },
                    176:        { 0,    CCOPT,  "VSPVAL",       VSPVAL  },
                    177:        { 0,    CCOPT,  "VSCCON",       VSCCON  },
                    178: /* Debug */
                    179:        { 0,    CCOPT,  "VDEBUG",       VDEBUG  },
                    180:        { 0,    CCOPT,  "VDLINE",       VLINES  },
                    181:        { 0,    CCOPT,  "VDTYPE",       VTYPES  },
                    182:        { 0,    CCOPT,  "VDSYMB",       VDSYMB  },
                    183:        { 0,    CCOPT,  "VDCALL",       VCALLS  },
                    184: /* Miscellaneous */
                    185:        { 0,    CCOPT,  "VSTAT",        VSTAT   },
                    186:        { 0,    CCOPT,  "VSINU",        VSINU   },
                    187:        { 0,    CCOPT,  "VPEEP",        VPEEP   },
                    188:        { 0,    CCOPT,  "VCOMM",        VCOMM   },
                    189:        { 0,    CCOPT,  "VQUIET",       VQUIET  },
                    190:        { 0,    CCOPT,  "VPSTR",        VPSTR   },
                    191:        { 0,    CCOPT,  "VROM",         VROM    },
                    192:        { 0,    CCOPT,  "VASM",         VASM    },
                    193:        { 0,    CCOPT,  "VPROF",        VPROF   },
                    194:        { 0,    CCOPT,  "VALIEN",       VALIEN  },
                    195:        { 0,    CCOPT,  "VNOOPT",       VNOOPT  },
                    196:        { 0,    CCOPT,  "VCHASM",       VCHASM  },
                    197:        { 0,    CCOPT,  "VCPP",         VCPP    },
                    198:        { 0,    CCOPT,  "VCPPE",        VCPPE   },
                    199:        { 0,    CCOPT,  "VTPROF",       VTPROF  },
                    200:        { 0,    CCOPT,  "V3GRAPH",      V3GRAPH },
                    201: #if 1
                    202: /* Intel flags */
                    203:        { 0,    CCOPT,  "VSMALL",       VSMALL  },
                    204:        { 0,    CCOPT,  "VLARGE",       VLARGE  },
                    205:        { 0,    CCOPT,  "V8087",        V8087   },
                    206:        { 0,    CCOPT,  "VRAM",         VRAM    },
                    207:        { 0,    CCOPT,  "VOMF",         VOMF    },
                    208:        { 0,    CCOPT,  "V80186",       V80186  },
                    209:        { 0,    CCOPT,  "V80287",       V80287  },
                    210:        { 0,    CCOPT,  "VALIGN",       VALIGN  },
                    211:        { 0,    CCOPT,  "VEMU87",       VEMU87  },
                    212: #endif
                    213: /* Motorola and Gemdos flags */
                    214:        { 12,   CCOPT,  "VGEMACC",      FLAG_GEMACC     },
                    215:        { 12,   CCOPT,  "VGEMAPP",      FLAG_GEMAPP     },
                    216:        { 12,   CCOPT,  "VGEM",         FLAG_GEMAPP     },
                    217:        { 10,   CCOPT,  "VSPLIM",       VSPLIM  },
                    218:        { 10,   CCOPT,  "VNOTRAPS",     VNOTRAPS        },
                    219: /* More miscellaneous flags */
                    220:        { 2,    CCOPT,  "VDB",          VDB     },
                    221:        { 2,    CCOPT,  "VS",           VS      },
                    222:        { 12,   CCOPT,  "A",            FLAG_A  },
                    223:        { 12,   CCOPT,  "Z",            FLAG_Z  },
                    224:        { 12,   CCOPT,  "c",            FLAG_c  },
                    225:        { 10,   CCOPT,  "S",            VASM    },
                    226:        { 2,    CCOPT,  "O",            FLAG_O  },
                    227:        { 0,    CCOPT,  "E",            VCPPE   },
                    228:        { 12,   CCOPT,  "f",            FLAG_f  },
                    229:        { 12,   CCOPT,  "VFLOAT",       FLAG_f  },
                    230:        { 0,    CCOPT,  "p",            VPROF   },
                    231:        { 12,   CCOPT,  "VKEEP",        FLAG_K  },
                    232:        { 12,   CCOPT,  "K",            FLAG_K  },
                    233:        { 0,    CCOPT,  "Q",            VQUIET  },
                    234:        { 12,   CCOPT,  "V",            FLAG_V  },
                    235:        { 12,   CCOPT,  "v",            FLAG_V  },
                    236: /* Preprocessor options */
                    237:        { 3,    PPOPT,  "D"     },
                    238:        { 3,    PPOPT,  "I"     },
                    239:        { 3,    PPOPT,  "U"     },
                    240: /* Loader options */
                    241:        { 4,    LDOPT,  "d"     },
                    242:        { 4,    LDOPT,  "i"     },
                    243:        { 4,    LDOPT,  "n"     },
                    244:        { 5,    LDOPT,  "o"     },
                    245:        { 4,    LDOPT,  "r"     },
                    246:        { 4,    LDOPT,  "s"     },
                    247:        { 4,    LDOPT,  "w"     },
                    248:        { 4,    LDOPT,  "x"     },
                    249:        { 4,    LDOPT,  "X"     },
                    250: #if 0
                    251:        { 4,    LDOPT,  "L"     },
                    252: #endif
                    253:        { 5,    LDOPT,  "e"     },
                    254:        { 5,    LDOPT,  "k"     },
                    255:        { 5,    LDOPT,  "u"     },
                    256: /* C dispatcher options */
                    257:        { 6,    CCOPT,  "q"     },
                    258:        { 7,    CCOPT,  "t"     },
                    259:        { 7,    CCOPT,  "B"     },
                    260:        { 7,    CCOPT,  "M"     },
                    261:        { 7,    CCOPT,  "N"     },
                    262:        { 8,    CCLIB,  "l"     },
                    263: 
                    264:        { -1,   -1,     ""      }
                    265: };
                    266: 
                    267: int    ccvariant = 0;                  /* Variant template */
                    268: VARIANT        variant;                        /* Binary variant template */
                    269: char   vstr[2*VMAXIM/VGRANU + 1];      /* Ascii variant string */
                    270: char   vstr2[2*VMAXIM/VGRANU + 1];     /* Ascii variant string for .m */
                    271: 
                    272: /*
                    273: ** Compiler parameters and flags
                    274: */
                    275: #define        NCMDA   128             /* Size of argument pointer buffer */
                    276: #define        NCMDB   1024            /* Size of argument buffer */
                    277: #define        NTMP    L_tmpnam        /* Temp file buffer size, from stdio.h */
                    278: #define        MAGIC   127             /* Exit status mask */
                    279: #define        NSLEEP  10              /* # of sleeps */
                    280: #define        DELAY   5               /* Sleep delay, seconds */
                    281: 
                    282: int    nldob;                  /* Number of objects created */
                    283: int    nfile;                  /* Number of files to compile or assemble */
                    284: int    nname;                  /* Number of file name arguments */
                    285: int    ndota;
                    286: int    ndotc;
                    287: int    ndotm;
                    288: int    ndoto;
                    289: int    ndots;
                    290: int    partial;                        /* Partial link specified */
                    291: 
                    292: #define        cflag   ((ccvariant&FLAG_c)!=0)
                    293: #define pflag  isvariant(VPROF)
                    294: #define        fflag   ((ccvariant&FLAG_f)!=0)
                    295: #define        Kflag   ((ccvariant&FLAG_K)!=0)
                    296: #define        Oflag   ((ccvariant&FLAG_O)!=0)
                    297: #define Sflag  isvariant(VASM)
                    298: #define        Eflag   isvariant(VCPPE)
                    299: #define Vflag  ((ccvariant&FLAG_V)!=0)
                    300: #define        Qflag   isvariant(VQUIET)
                    301: #define        Aflag   ((ccvariant&FLAG_A)!=0)
                    302: #define        Zflag   ((ccvariant&FLAG_Z)!=0)
                    303: #define GEMAPPflag     ((ccvariant&FLAG_GEMAPP)!=0)
                    304: #define GEMACCflag     ((ccvariant&FLAG_GEMACC)!=0)
                    305: 
                    306: int    qpass = NONE;           /* Quit after this pass */
                    307: int    nload;                  /* No load phase */
                    308: char   *outf;                  /* Output file */
                    309: char   *doutf;                 /* Default output file stem */
                    310: char   *dpath = DEFPATH;
                    311: char   *dlibpath = DEFLIBPATH;
                    312: int    xstat;                  /* Exit status */
                    313: 
                    314: char   *cmda[NCMDA];           /* Argument pointer buffer */
                    315: char   cmdb[NCMDB];            /* Argument buffer */
                    316: char   newo[NTMP];             /* New object to be removed */
                    317: char   tmp[7][NTMP];           /* Intermediate filenames */
                    318: char   istmp[7];               /* Truth about their temporariness */
                    319: int    argf[NCMDA];            /* Argument flags */
                    320: char   optb[NCMDB];            /* Option rewrite buffer */
                    321: char   *optp = &optb[0];       /* Option rewrite position */
                    322: 
                    323: char   *makepass();
                    324: char   *makelib();
                    325: int    cleanup();
                    326: char   *getenv();
                    327: char   *tempnam();
                    328: char   *path();
                    329: 
                    330: main(argc, argv)
                    331: char *argv[];
                    332: {
                    333:        register char *p;
                    334:        register struct option *op;
                    335:        int i, narg, c;
                    336: 
                    337: #if COHERENT
                    338:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                    339:                signal(SIGINT, cleanup);
                    340: #endif
                    341:        setbuf(stdout, NULL);
                    342:        setbuf(stderr, NULL);
                    343:        setvariant(VSUVAR);
                    344:        setvariant(VSMEMB);
                    345:        setvariant(VSLCON);
                    346:        setvariant(VSPVAL);
                    347:        setvariant(VPEEP);
                    348:        setvariant(VCOMM);
                    349:        setvariant(V80186);
                    350: 
                    351:        if (p = getenv("PATH")) dpath = p;
                    352:        if (p = getenv("LIBPATH")) dlibpath = p;
                    353:        if (p = getenv("EDITOR")) strcpy(pass[ED].p_pln, p);
                    354: 
                    355:        for (i=1; i<argc; i+=narg) {
                    356:                narg = 1;
                    357:                p = argv[i];
                    358:                if (*p++ == '-') {
                    359:                        static char tppopt[64] = "-";
                    360:                        static char tldopt[64] = "-";
                    361:                        char *tpp = &tppopt[1];
                    362:                        char *tlp = &tldopt[1];
                    363: 
                    364:                        if (*p == '\0') {
                    365:                badopt:
                    366:                                whatopt(argv[i]);
                    367:                                continue;
                    368:                        }
                    369:                        while (*p != '\0') {
                    370:                                for (op = &option[0]; ; op += 1)
                    371:                                        if (op->o_name[0] == '\0')
                    372:                                                goto badopt;
                    373:                                        else if (opeq(op->o_name, p))
                    374:                                                break;
                    375:                                if (VeryVflag && Vflag)
                    376:                                        printf("Option: -%s\n", op->o_name);
                    377:                                argf[i] |= op->o_flag;
                    378:                                switch (op->o_kind) {
                    379:                                case 0:
                    380:                                        chgvariant(op->o_bits);
                    381:                                        p += strlen(op->o_name);
                    382:                                        continue;
                    383:                                case 10:
                    384:                                        setvariant(op->o_bits);
                    385:                                        p += strlen(op->o_name);
                    386:                                        continue;
                    387:                                case 2:
                    388:                                        ccvariant ^= op->o_bits;
                    389:                                        p += strlen(op->o_name);
                    390:                                        /* Set strict */
                    391:                                        if ((ccvariant&VS) != 0) {
                    392:                                                for (op = &option[0];; op += 1)
                    393:                                                        if (op->o_name[1]=='S')
                    394:                                                                break;
                    395:                                                while (op->o_name[1]=='S') {
                    396:                                                        setvariant(op->o_bits);
                    397:                                                        op += 1;
                    398:                                                }
                    399:                                        }
                    400:                                        /* Set debug */
                    401:                                        if ((ccvariant&VDB) != 0) {
                    402:                                                for (op = &option[0];; op += 1)
                    403:                                                        if (op->o_name[1]=='D')
                    404:                                                                break;
                    405:                                                while (op->o_name[1]=='D') {
                    406:                                                        setvariant(op->o_bits);
                    407:                                                        op += 1;
                    408:                                                }
                    409:                                        }
                    410:                                        continue;
                    411:                                case 12:
                    412:                                        ccvariant |= op->o_bits;
                    413:                                        p += strlen(op->o_name);
                    414:                                        continue;
                    415:                                case 3:
                    416:                                        while (*tpp++ = *p)
                    417:                                                p++;
                    418:                                        continue;
                    419:                                case 5:
                    420:                                        if (*p == 'o') {
                    421:                                                outf = argv[i+narg];
                    422:                                        }
                    423:                                        if (*p == 'u')
                    424:                                                ndoto += 1;
                    425:                                        if (i+narg >= argc)
                    426:                                                missingname();
                    427:                                        argf[i+narg++] = LDOPT;
                    428:                                        /* Fall through */
                    429:                                case 4:
                    430:                                        if (*p == 'r')
                    431:                                                ++partial;
                    432:                                        strcpy(tlp, op->o_name);
                    433:                                        tlp += strlen(op->o_name);
                    434:                                        p += strlen(op->o_name);
                    435:                                        continue;
                    436:                                case 6:
                    437:                                        if ((c = p[1]) == '\0'
                    438:                                         || (c = getpsn(c)) < CPP)
                    439:                                                goto badopt;
                    440:                                        qpass = c;
                    441:                                        p += 2;
                    442:                                        continue;
                    443:                                case 7:
                    444:                                        c = p[0];
                    445:                                        getpass(c, p+1);
                    446:                                        p = dnul;
                    447:                                        continue;
                    448:                                case 8:
                    449:                                        p = dnul;
                    450:                                        continue;
                    451:                                default:
                    452:                                        cfatal("options");
                    453:                                }
                    454:                        }
                    455:                        if (((unsigned)argf[i]-1)&((unsigned)argf[i])) {
                    456:                                strcpy(optp, argv[i]);
                    457:                                argv[i] = optp;
                    458:                                optp += strlen(optp)+1;
                    459:                                strcpy(optp, tppopt);
                    460:                                optp += strlen(optp)+1;
                    461:                                strcpy(optp, tldopt);
                    462:                                optp += strlen(optp)+1;
                    463:                        }
                    464:                } else {
                    465:                        while (*p) p+=1;
                    466:                        c = *--p;
                    467:                        if (*--p != '.') c = 0;
                    468:                        if (c >= 'A' && c <= 'Z')
                    469:                                c |= 'a'-'A';
                    470:                        switch (c) {
                    471:                        case 'h':
                    472:                        case 'c':
                    473:                                if (doutf == NULL) doutf = argv[i];
                    474:                                ndotc += 1;
                    475:                                argf[i] = CCARG;
                    476:                                if (VeryVflag && Vflag)
                    477:                                        printf("cc file: %s\n", argv[i]);
                    478:                                break;
                    479:                        case 's':
                    480:                                if (doutf == NULL) doutf = argv[i];
                    481:                                ndots += 1;
                    482:                                argf[i] = ASARG;
                    483:                                if (VeryVflag && Vflag)
                    484:                                        printf("as file: %s\n", argv[i]);
                    485:                                break;
                    486:                        case 'm':
                    487:                                if (doutf == NULL) doutf = argv[i];
                    488:                                ndotm += 1;
                    489:                                argf[i] = MARG;
                    490:                                if (VeryVflag && Vflag)
                    491:                                        printf("m file: %s\n", argv[i]);
                    492:                                break;
                    493:                        case 'o':
                    494:                                if (doutf == NULL) doutf = argv[i];
                    495:                                ndoto += 1;
                    496:                                argf[i] = LDARG;
                    497:                                if (VeryVflag && Vflag)
                    498:                                        printf("ld file: %s\n", argv[i]);
                    499:                                break;
                    500:                        case 'a':
                    501:                        default:
                    502:                                ndota += 1;
                    503:                                argf[i] = LDLIB;
                    504:                                if (VeryVflag && Vflag)
                    505:                                        printf("library: %s\n", argv[i]);
                    506:                                break;
                    507:                        }
                    508:                }
                    509:        }
                    510: #if GEMDOS
                    511:        if (Vflag) {
                    512:         fprintf(stderr, "Mark Williams C for the Atart ST, %s\n", VERS);
                    513:         fprintf(stderr, "Copyright 1984-1987, Mark Williams Co., Chicago\n");
                    514:        }
                    515: #endif
                    516:        resolve();
                    517:        compile(argc, argv);
                    518:        if (nload==0 && runld(argc, argv)==0) {
                    519:                if (Kflag==0 && nldob==1 && newo[0]!=0)
                    520:                        rm(newo);
                    521:        }
                    522:        exit(xstat);
                    523: }
                    524: 
                    525: /*
                    526:  * Resolve remaining ambiguities.
                    527:  * Initialize variant arguments and files.
                    528:  */
                    529: resolve()
                    530: {
                    531:        register int i;
                    532:        extern char *index();
                    533: 
                    534:        for (i = CPP; i < ALL; i += 1) {
                    535:                if (pass[i].p_flag & P_BACK)
                    536:                        ;
                    537:                else if (pass[i].p_flag & P_LIB)
                    538:                        pass[i].p_dir = dlibpath;
                    539:                else if (pass[i].p_flag & P_BIN)
                    540:                        pass[i].p_dir = dpath;
                    541:                strcpy(cmdb, pass[i].p_mch);
                    542:                strcat(cmdb, pass[i].p_pln);
                    543: #if GEMDOS
                    544:                if (i <= ED && index(pass[i].p_pln, '.') == NULL)
                    545:                        strcat(cmdb, i==ED ? ".tos" : ".prg");
                    546: #endif
                    547:                if (strlen(cmdb) > PTMP-1)
                    548:                        cfatal("pass name \"%s\" is too long", cmdb);
                    549:                strcpy(pass[i].p_pln, cmdb);
                    550:        }
                    551: #if 1
                    552:        if (isvariant(VOMF)) {
                    553:                clrvariant(VCOMM);
                    554:                if (isvariant(VLARGE) && isvariant(VSMALL))
                    555:                        cfatal("invalid model specification");
                    556:                if (notvariant(VLARGE) && notvariant(VSMALL))
                    557:                        setvariant(VSMALL);
                    558:        } else {
                    559:                clrvariant(VLARGE);
                    560:                setvariant(VSMALL);
                    561:        }
                    562: #endif
                    563:        if (GEMAPPflag && GEMACCflag)
                    564:                cfatal("specify VGEMAPP or VGEMACC, not both");
                    565:        if (GEMAPPflag) getpass('N', "rcrtsg.o");
                    566:        if (GEMACCflag) getpass('N', "rcrtsd.o");
                    567:        if (pflag) getpass('N', "rmcrts0.o");
                    568:        if (Eflag) setvariant(VCPP);
                    569:        if (qpass == NONE) {
                    570:                if (isvariant(VCPP))
                    571:                        qpass = CPP;
                    572:                else if (Sflag)
                    573:                        qpass = CC3;
                    574:                else if (cflag)
                    575:                        qpass = AS;
                    576:                else
                    577:                        qpass = LD;
                    578:        } else if (qpass == CPP)
                    579:                setvariant(VCPP);
                    580:        if (VeryVflag && Vflag)
                    581:                printf("quit pass is %s\n", pass[qpass].p_pln);
                    582:        makvariant(vstr);
                    583:        if (ndotm != 0 && notvariant(VCPP) && notvariant(VCPPE)) {
                    584:                setvariant(VCPP);
                    585:                setvariant(VCPPE);
                    586:                makvariant(vstr2);
                    587:                clrvariant(VCPP);
                    588:                clrvariant(VCPPE);
                    589:        }
                    590:        nfile = ndotc + ndots + ndotm;
                    591:        nname = nfile + ndoto + ndota;
                    592:        if (nname == 0) {
                    593:                fprintf(stderr,
                    594:                        "Usage: cc [ -o output ] [ options ] file [ ... ]\n");
                    595:                exit(1);
                    596:        }
                    597:        if (qpass < LD)
                    598:                ++nload;
                    599:        if (Aflag)
                    600:                maketempfile(6);
                    601:        if ( ! Eflag) {
                    602:                chkofile();
                    603:                if (Kflag) {
                    604:                        pass[CPP].p_ofn = pass[CC0].p_ifn = tmp[0];
                    605:                        pass[CC0].p_ofn = pass[CC1].p_ifn = tmp[1];
                    606:                        pass[CC1].p_ofn = pass[CC2].p_ifn = tmp[2];
                    607:                        if ( ! Sflag) {
                    608:                                pass[CC2].p_sfn = tmp[3];
                    609:                                pass[CC2].p_ofn = tmp[5];
                    610:                        } else {
                    611:                                pass[CC3].p_ifn = pass[CC2].p_ofn = tmp[3];
                    612:                                pass[CC3].p_ofn = tmp[5];
                    613:                        }
                    614:                } else {
                    615:                        pass[CPP].p_ofn = pass[CC0].p_ifn = tmp[0];
                    616:                        pass[CC0].p_ofn = pass[CC1].p_ifn = tmp[1];
                    617:                        pass[CC1].p_ofn = pass[CC2].p_ifn = tmp[0];
                    618:                        if ( ! Sflag) {
                    619:                                pass[CC2].p_sfn = tmp[1];
                    620:                                pass[CC2].p_ofn = tmp[5];
                    621:                        } else {
                    622:                                pass[CC3].p_ifn = pass[CC2].p_ofn = tmp[1];
                    623:                                pass[CC3].p_ofn = tmp[5];
                    624:                        }
                    625:                        maketempfile(0);
                    626:                        maketempfile(1);
                    627:                }
                    628:                pass[AS].p_ofn = tmp[5];
                    629:        }
                    630: }
                    631: 
                    632: maketempfile(i) int i;
                    633: {
                    634:        char *p;
                    635:        strcpy(tmp[i], p = tempnam(pass[TMP].p_dir, pass[TMP].p_pln));
                    636:        free(p);
                    637:        ++istmp[i];
                    638: }
                    639: 
                    640: /*
                    641: ** Compilation.
                    642: */
                    643: compile(argc, argv)
                    644: char *argv[];
                    645: {
                    646:        register char *p1;
                    647:        register c, i, err;
                    648: 
                    649:        err = 0;
                    650:        for (i=1; i<argc; ++i) {
                    651:                if ((c = (argf[i] & (CCARG | ASARG | MARG))) == 0)
                    652:                        continue;
                    653:                p1 = argv[i];
                    654:                if (err) {
                    655:                        err = 0;
                    656:                        if (runme(p1)) {
                    657:                                ++nload;
                    658:                        } else {
                    659:                                --i;
                    660:                                xstat = 0;
                    661:                        }
                    662:                        continue;
                    663:                }
                    664:                if (nfile > 1 && Qflag == 0)
                    665:                        printf("%s:\n", p1);
                    666:                setfiles(c, p1);
                    667:                if (c == CCARG) {
                    668:                        if (runpp(argc, argv, vstr)) {
                    669:                                if (Aflag) {
                    670:                                        ++err; --i;
                    671:                                } else
                    672:                                        ++nload;
                    673:                                continue;
                    674:                        }
                    675:                        if (qpass <= CC0)
                    676:                                continue;
                    677:                        if (runcc(CC1)) {
                    678:                                ++nload;
                    679:                                continue;
                    680:                        }
                    681:                        if (qpass <= CC1)
                    682:                                continue;
                    683:                        if (runcc(CC2)) {
                    684:                                ++nload;
                    685:                                continue;
                    686:                        }
                    687:                        if (qpass <= CC2)
                    688:                                continue;
                    689:                        if (Sflag) {
                    690:                                if (runcc(CC3)) {
                    691:                                        ++nload;
                    692:                                        continue;
                    693:                                }
                    694:                                if (qpass <= CC3)
                    695:                                        continue;
                    696:                        }
                    697:                } else if (c == ASARG && qpass>=AS) {
                    698:                        if (runas()) {
                    699:                                if (Aflag) {
                    700:                                        ++err; --i;
                    701:                                } else
                    702:                                        ++nload;
                    703:                                continue;
                    704:                        }
                    705:                        if (qpass <= AS)
                    706:                                continue;
                    707:                } else if (c == MARG) {
                    708:                        if (runpp(argc, argv, vstr2)) {
                    709:                                if (Aflag) {
                    710:                                        ++err; --i;
                    711:                                } else
                    712:                                        ++nload;
                    713:                                continue;
                    714:                        }
                    715:                        if (qpass < AS)
                    716:                                continue;
                    717:                        if (runas()) {
                    718:                                if (Aflag) {
                    719:                                        ++err; --i;
                    720:                                } else
                    721:                                        ++nload;
                    722:                                continue;
                    723:                        }
                    724:                        if (qpass == AS)
                    725:                                continue;
                    726:                }
                    727:                makeft(p1, p1, "o");
                    728:        }
                    729:        cleanup(0);
                    730: }
                    731: 
                    732: runpp(argc, argv, var)
                    733: register char *argv[];
                    734: char var[];
                    735: {
                    736:        register char **cp;
                    737:        register int i;
                    738:        char *p1;
                    739: 
                    740:        cp = cmda;
                    741:        p1 = cmdb;
                    742:        p1 = makepass(CC0, *cp++ = p1, AEXEC);
                    743:        *cp++ = var;
                    744:        *cp++ = pass[CPP].p_ifn;
                    745:        if (qpass < CC0)
                    746:                *cp++ = Kflag ? pass[CPP].p_ofn : "-";
                    747:        else
                    748:                *cp++ = pass[CC0].p_ofn;
                    749:        for (i=1; i<argc; ++i) {
                    750:                if ((argf[i]&PPOPT) != 0) {
                    751:                        *cp++ = argv[i];
                    752:                        if ((argf[i]&~PPOPT) != 0)
                    753:                                cp[-1] += strlen(cp[-1])+1;
                    754:                }
                    755:        }
                    756:        *cp = 0;
                    757:        return (run(Aflag));
                    758: }
                    759: 
                    760: runcc(pn)
                    761: {
                    762:        register char **cp;
                    763: 
                    764:        cp = cmda;
                    765:        makepass(pn, *cp++ = cmdb, AEXEC);
                    766:        *cp++ = vstr;
                    767:        *cp++ = pass[pn].p_ifn;
                    768:        *cp++ = pass[pn].p_ofn;
                    769:        if (pn == CC2)
                    770:                *cp++ = pass[CC2].p_sfn;
                    771:        *cp = 0;
                    772:        return (run(0));
                    773: }
                    774: 
                    775: runas()
                    776: {
                    777:        register char **cp;
                    778: 
                    779:        cp = cmda;
                    780:        makepass(AS, *cp++ = cmdb, AEXEC);
                    781:        *cp++ = "-gx";
                    782:        *cp++ = "-o";
                    783:        *cp++ = pass[AS].p_ofn;
                    784:        *cp++ = pass[AS].p_ifn;
                    785:        *cp = 0;
                    786:        return (run(Aflag));
                    787: }
                    788: 
                    789: runme(fn)
                    790: char *fn;
                    791: {
                    792:        register char **cp;
                    793: 
                    794:        cp = cmda;
                    795:        makepass(ED, *cp++ = cmdb, AEXEC);
                    796:        *cp++ = fn;
                    797:        *cp++ = "-e";
                    798:        *cp++ = tmp[6];
                    799:        *cp = 0;
                    800:        return (run(0));
                    801: }
                    802: runld(argc, argv)
                    803: char *argv[];
                    804: {
                    805:        char *p1;
                    806:        register char *p2;
                    807:        register char **cp;
                    808:        char **cp1;
                    809:        register char **cp2;
                    810:        int i;
                    811:        static char buff[32];
                    812: 
                    813:        cp = cmda;
                    814:        p1 = makepass(LD, *cp++ = cmdb, AEXEC);
                    815:        *cp++ = "-X";
                    816:        if (outf == NULL) {
                    817:                *cp++ = "-o";
                    818:                if (partial || doutf == NULL) {
                    819: #if COHERENT
                    820:                        *cp++ = "l.out";
                    821: #endif
                    822: #if GEMDOS
                    823:                        *cp++ = "l.prg";
                    824: #endif
                    825:                } else {
                    826:                        basename(doutf, buff);
                    827: #if GEMDOS
                    828:                        strcat(buff, ".prg");
                    829: #endif
                    830:                        *cp++ = buff;
                    831:                }
                    832:        }
                    833:        for (i=1; i<argc; ++i) {
                    834:                if ((argf[i]&LDOPT)!=0) {
                    835:                        *cp++ = argv[i];
                    836:                        if ((argf[i]&~LDOPT)!=0) {
                    837:                                cp[-1] += strlen(cp[-1])+1;
                    838:                                cp[-1] += strlen(cp[-1])+1;
                    839:                        }
                    840:                }
                    841:        }
                    842:        cp1 = cp;
                    843:        p1 = makepass(CRT, *cp++ = p1, AREAD);
                    844:        if (fflag) {
                    845:                *cp++ = "-u";
                    846:                *cp++ = "_dtefg_";
                    847:        }
                    848:        for (i=1; i<argc; ++i) {
                    849:                p2 = argv[i];
                    850:                if ((argf[i]&CCLIB)!=0) {
                    851:                        while (*p2++ != 'l');
                    852:                        p1 = makelib(LIB, *cp++ = p1, p2);
                    853:                } else if ((argf[i]&(CCARG|ASARG|MARG|LDARG))!=0) {
                    854:                        for (cp2=cp1; cp2<cp; ++cp2)
                    855:                                if (strcmp(*cp2, p2) == 0)
                    856:                                        break;
                    857:                        if (cp2 == cp) {
                    858:                                *cp++ = p2;
                    859:                                ++nldob;
                    860:                        }
                    861:                } else if ((argf[i]&LDLIB)!=0) {
                    862:                        *cp++ = p2;
                    863:                }
                    864:        }
                    865:        if ( ! partial && (GEMAPPflag || GEMACCflag)) {
                    866:                p1 = makelib(LIB, *cp++ = p1, "aes");
                    867:                p1 = makelib(LIB, *cp++ = p1, "vdi");
                    868:        }
                    869:        p1 = makelib(LIB, *cp++ = p1, "c");
                    870:        *cp = 0;
                    871:        return (run(0));
                    872: }
                    873: 
                    874: basename(in, out)
                    875: char *in, *out;
                    876: {
                    877:        register char *ip = in, *op = out;
                    878:        register int c;
                    879: 
                    880:        while (*ip++)
                    881:                ;
                    882:        ip -= 2;
                    883:        while (ip >= in && *ip != PATHSEP)
                    884:                --ip;
                    885:        while ((c = *++ip) && c != '.')
                    886:                *op++ = c;
                    887:        *op = '\0';
                    888: }
                    889: 
                    890: run(catch_errors) int catch_errors;
                    891: {
                    892:        int new_fd;
                    893:        int saved_fd;
                    894:        int s;
                    895:        extern char **environ;
                    896: 
                    897:        if (Vflag) {
                    898:                char *cp, **cpp;
                    899:                cpp = cmda;
                    900:                while ((cp = *cpp) != NULL) {
                    901:                        if (cpp != cmda)
                    902:                                putchar(' ');
                    903:                        printf("%s", cp);
                    904:                        ++cpp;
                    905:                }
                    906:                putchar('\n');
                    907:                fflush(stdout);
                    908:        }
                    909:        if (catch_errors) {
                    910:                fflush(stdout);
                    911:                saved_fd = dup(1);
                    912:                if ((new_fd = creat(tmp[6], 0644)) < 0)
                    913:                        cfatal("%s: %s", tmp[6], sys_errlist[errno]);
                    914:                if (dup2(new_fd, 1) < 0)
                    915:                        cfatal("dup2 failed");
                    916:        }
                    917: #if    COHERENT
                    918:        {
                    919:                int nsleep;
                    920:                int status;
                    921:                int pid;
                    922:                nsleep = NSLEEP;
                    923:                while ((pid=fork())<0 && nsleep--)
                    924:                        sleep(DELAY);
                    925:                if (pid < 0)
                    926:                        cfatal("can't fork");
                    927:                if (pid == 0) {
                    928:                        execve(cmda[0], cmda, environ);
                    929:                        exit(MAGIC);
                    930:                }
                    931:                while (wait(&status) != pid)
                    932:                        ;
                    933:                if ((s = status&0177)!=0 && s!=SIGINT) {
                    934:                        extern char *signame[];
                    935: 
                    936:                        fprintf(stderr, "cc: %s ", cmda[0]);
                    937:                        if (s==SIGSYS && (status&0200)==0)
                    938:                                fprintf(stderr, "exec failed");
                    939:                        else
                    940:                                fprintf(stderr, signame[s]);
                    941:                        if ((status&0200) != 0)
                    942:                                fprintf(stderr, " -- core dumped");
                    943:                        fprintf(stderr, "\n");
                    944:                } else if ((s = (status>>8)&0377) == MAGIC)
                    945:                        cfatal("cannot execute %s", cmda[0]);
                    946:        }
                    947: #else
                    948:        if (s = execve(cmda[0], cmda, environ))
                    949:                if (s < 0)
                    950:                        perror(cmda[0]);
                    951: #endif
                    952:        if (catch_errors) {
                    953:                fflush(stdout);
                    954:                if (dup2(saved_fd, 1) < 0)
                    955:                        cfatal("dup2 failed");
                    956:                if (close(new_fd) < 0)
                    957:                /* cfatal("error on close") */ ;
                    958:        }
                    959:        if (s != 0)
                    960:                xstat = 1;
                    961:        return (s);
                    962: }
                    963: 
                    964: /*
                    965: ** Option processing.
                    966: */
                    967: 
                    968: /*
                    969:  * Compare option name to argument.
                    970:  */
                    971: opeq(op, ap)
                    972: register char *op, *ap;
                    973: {
                    974:        while (*op!=0)
                    975:                if (*op++ != *ap++)
                    976:                        return (0);
                    977:        return (1);
                    978: }
                    979: 
                    980: 
                    981: /*
                    982:  * Get short pass name.
                    983:  *     translate single character code into pass index number.
                    984:  */
                    985: getpsn(c)
                    986: register int c;
                    987: {
                    988:        register int pn;
                    989: 
                    990:        for (pn = CPP; pn < ALL; pn += 1)
                    991:                if (pass[pn].p_psn == c)
                    992:                        return (pn);
                    993:        return (NONE);
                    994: }
                    995: 
                    996: /*
                    997:  * Process -t*, -B*, -M* options.
                    998:  *     -t*     sets take flag for specified passes.
                    999:  *     -B*     copies prefix string for flagged passes
                   1000:  *             or for all machine dependent passes if none flagged.
                   1001:  *     -M*     copies machine string for machine dependent passes.
                   1002:  *     -N*     renames a pass, such as crts0.o.
                   1003:  */
                   1004: getpass(c, cp)
                   1005: register int c;
                   1006: register char *cp;
                   1007: {
                   1008:        if (c == 't') {         /* Take passes from backup */
                   1009:                if (*cp != 0)
                   1010:                        while ((c = *cp++) != 0)
                   1011:                                if ((c = getpsn(c)) >= CPP) {
                   1012:                                        pass[c].p_flag |= P_TAKE;
                   1013:                                        pass[c].p_dir = dnul;
                   1014:                                        if (Vflag)
                   1015:                                                passrpt(c);
                   1016:                                } else {
                   1017:                                        badpsn(cp[-1]);
                   1018:                                }
                   1019:                else
                   1020:                        getpass('t', "01234");
                   1021:        } else if (c == 'B') {  /* Get backup string */
                   1022:                for (c = CPP; c < ALL; c += 1) {
                   1023:                        if ((pass[c].p_flag&P_TAKE) != 0) {
                   1024:                                pass[c].p_flag ^= P_TAKE;
                   1025:                                pass[c].p_flag |= P_BACK;
                   1026:                                pass[c].p_dir = cp;
                   1027:                                if (Vflag)
                   1028:                                        passrpt(c);
                   1029:                        }
                   1030:                }
                   1031:        } else if (c == 'M') {  /* Machine prefix string */
                   1032:                if (strlen(cp) > PTMP-1)
                   1033:                        toolong(cp);
                   1034:                strcpy(dmch, cp);
                   1035:                if (Vflag)
                   1036:                        printf("Prefix: %s\n", dmch);
                   1037:        } else if (c == 'N') {  /* New pass name */
                   1038:                if ((c = getpsn(*cp++)) >= CPP) {
                   1039:                        if (strlen(cp) > PTMP-1)
                   1040:                                toolong(cp);
                   1041:                        if (Vflag)
                   1042:                                printf("Rename: %s to %s\n", pass[c].p_pln, cp);
                   1043:                        strcpy(pass[c].p_pln, cp);
                   1044:                } else
                   1045:                        badpsn(cp[-1]);
                   1046:        }
                   1047: }
                   1048: 
                   1049: passrpt(c)
                   1050: register int c;
                   1051: {
                   1052:        printf("Use: {%s}%s%s\n", pass[c].p_dir, pass[c].p_mch, pass[c].p_pln);
                   1053: }
                   1054: 
                   1055: missingname()
                   1056: {
                   1057:        fprintf(stderr, "cc: missing name in -o, -e or -u\n");
                   1058:        exit(1);
                   1059: }
                   1060: 
                   1061: badoutput()
                   1062: {
                   1063:        fprintf(stderr, "cc: improbable name in -o: %s\n", outf);
                   1064:        exit(1);
                   1065: }
                   1066: 
                   1067: toomany()
                   1068: {
                   1069:        fprintf(stderr, "cc: too many files for -o option\n");
                   1070:        exit(1);
                   1071: }
                   1072: 
                   1073: badpsn(c)
                   1074: {
                   1075:        fprintf(stderr, "cc: unknown short path name: %c\n", c);
                   1076:        exit(1);
                   1077: }
                   1078: 
                   1079: toolong(cp)
                   1080: char *cp;
                   1081: {
                   1082:        fprintf(stderr, "cc: name, prefix, or directory too long: %s\n", cp);
                   1083:        exit(1);
                   1084: }
                   1085: 
                   1086: /*
                   1087:  * Check specified output file name,
                   1088:  * or construct name from first file
                   1089:  * name seen.
                   1090:  */
                   1091: chkofile()
                   1092: {
                   1093:        register char *fn;
                   1094:        register char c;
                   1095: 
                   1096:        if ((fn = outf) == NULL)
                   1097:                return;
                   1098:        if (fn[0] == '-')
                   1099:                badoutput();
                   1100:        if (nname > 1 && qpass < LD)
                   1101:                toomany();
                   1102:        while (*fn != 0)
                   1103:                ++fn;
                   1104:        while (*fn != '.' && fn > outf)
                   1105:                --fn;
                   1106:        if (*fn++ == '.' && (c = *fn++) &&  *fn == '\0') {
                   1107:                if (c == 'c'
                   1108:                || c == 'h'
                   1109:                || c == 'm'
                   1110:                || (c != 'o' && cflag)
                   1111:                || (c == 'o' && !cflag)
                   1112:                || (c != 's' && Sflag)
                   1113:                || (c == 's' && !Sflag))
                   1114:                        badoutput();
                   1115:        } else {
                   1116:                if (Sflag || cflag)
                   1117:                        badoutput();
                   1118:        }
                   1119: }
                   1120: 
                   1121: whatopt(s)
                   1122: char *s;
                   1123: {
                   1124:        fprintf(stderr, "cc: unrecognized option: %s\n", s);
                   1125:        exit(1);
                   1126: }
                   1127: 
                   1128: cfatal(s)
                   1129: char *s;
                   1130: {
                   1131:        fprintf(stderr, "cc: fatal error: %r\n", &s);
                   1132:        cleanup(0);
                   1133:        exit(1);
                   1134: }
                   1135: 
                   1136: /*
                   1137: ** Intermediate file processing.
                   1138: */
                   1139: /*
                   1140:  * Given cp -> `name.[chms]' rewrite ultimate destination and intermediates
                   1141:  * if necessary.
                   1142:  */
                   1143: setfiles(c, cp)
                   1144: int c;
                   1145: register char *cp;
                   1146: {
                   1147:        register char *ip;
                   1148: 
                   1149:        ip = cp;
                   1150:        if (qpass < LD && outf != NULL)
                   1151:                cp = outf;
                   1152:        if (c == CCARG) {
                   1153:                pass[CPP].p_ifn = ip;
                   1154:                if (Eflag)
                   1155:                        return;
                   1156:                if (Kflag) {
                   1157:                        makeft(pass[CPP].p_ofn, cp, "i");
                   1158:                        makeft(pass[CC0].p_ofn, cp, "0");
                   1159:                        makeft(pass[CC1].p_ofn, cp, "1");
                   1160:                        if ( ! Sflag)
                   1161:                                makeft(pass[CC2].p_sfn, cp, "2");
                   1162:                        else
                   1163:                                makeft(pass[CC2].p_ofn, cp, "2");
                   1164:                }
                   1165:        } else if (c == MARG) {
                   1166:                pass[CPP].p_ifn = ip;
                   1167:                if (Kflag)
                   1168:                        makeft(pass[CC0].p_ofn, cp, "s");
                   1169:                pass[AS].p_ifn = pass[CC0].p_ofn;
                   1170:        } else if (c == ASARG)
                   1171:                pass[AS].p_ifn = ip;
                   1172:        makeft(tmp[5], cp, Sflag ? "s" : "o");
                   1173:        if (!Sflag && newo[0] == 0 && access(tmp[5], 0) < 0)
                   1174:                strcpy(newo, tmp[5]);
                   1175: }
                   1176: 
                   1177: /*
                   1178:  * Unlink a file.
                   1179:  * If `-V' echo the rm.
                   1180:  */
                   1181: rm(s)
                   1182: register char *s;
                   1183: {
                   1184:        if (Vflag)
                   1185:                printf("rm %s\n", s);
                   1186:        unlink(s);
                   1187: }
                   1188: 
                   1189: /*
                   1190:  * Cleanup after yourself if
                   1191:  * the user hits interrupt during a compile (sig == SIGINT),
                   1192:  * or when all compiles have completed (sig == 0).
                   1193:  */
                   1194: cleanup(sig)
                   1195: {
                   1196:        register int i;
                   1197: 
                   1198: #if COHERENT
                   1199:        if (sig == SIGINT)
                   1200:                signal(SIGINT, SIG_IGN);
                   1201: #endif
                   1202:        for (i = 0; i < 7; i += 1)
                   1203:                if (istmp[i])
                   1204:                        rm(tmp[i]);
                   1205: #if COHERENT
                   1206:        if (sig == SIGINT && nldob==1 && newo[0]!=0)
                   1207:                rm(newo);
                   1208:        if (sig == SIGINT)
                   1209:                exit(1);
                   1210: #endif
                   1211: }
                   1212: 
                   1213: /*
                   1214: ** Name construction.
                   1215: */
                   1216: char *
                   1217: ccpath(cp, p, n, mode) register char *cp; char *p, *n; int mode;
                   1218: {
                   1219:        register char *pn;
                   1220:        if (VeryVflag && Vflag)
                   1221:                printf("search %s for %s\n", p, n);
                   1222:        while ((pn = path(p, n, mode)) == NULL) {
                   1223:                if (Zflag) {    /* Disk swap dialog flag */
                   1224: fprintf(stderr, "Insert %s's disk in a free drive and press <Return>\n", n);
                   1225:                        gets(cp);
                   1226:                        continue;
                   1227:                }
                   1228:                pn = n;
                   1229:                break;
                   1230:        }
                   1231:        while (*cp++ = *pn++) ;
                   1232:        return cp;
                   1233: }
                   1234: 
                   1235: char *
                   1236: makepass(pn, cp, mode)
                   1237: int pn;
                   1238: register char *cp;
                   1239: int mode;
                   1240: {
                   1241:        return ccpath(cp, pass[pn].p_dir, pass[pn].p_pln, mode);
                   1242: }
                   1243: 
                   1244: char *
                   1245: makelib(pn, cp, lp)
                   1246: int pn;
                   1247: char *cp;
                   1248: char *lp;
                   1249: {
                   1250:        strcpy(cp, pass[pn].p_pln);
                   1251:        strcat(cp, lp);
                   1252:        strcat(cp, ".a");
                   1253:        return ccpath(cp, pass[pn].p_dir, cp, AREAD);
                   1254: }
                   1255: 
                   1256: makeft(op, ip, ft)
                   1257: char *op, *ip, *ft;
                   1258: {
                   1259:        register char *ep, *tp;
                   1260:        register c;
                   1261:        char *dp;
                   1262: 
                   1263:        ep = ip;
                   1264:        tp = op;
                   1265:        dp = NULL;
                   1266:        while ((c = *ep++) != '\0') {
                   1267:                if (c == PATHSEP && ip != outf) {
                   1268:                        tp = op;
                   1269:                        dp = NULL;
                   1270:                } else {
                   1271:                        if (c == '.')
                   1272:                                dp = tp;
                   1273:                        *tp++ = c;
                   1274:                }
                   1275:        }
                   1276:        if (ip == outf)
                   1277:                return;
                   1278:        if (dp != NULL)
                   1279:                tp = dp;
                   1280:        *tp++ = '.';
                   1281:        ep = ft;
                   1282:        while (*tp++ = *ep++)
                   1283:                ;
                   1284: }

unix.superglobalmegacorp.com

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