Annotation of 43BSDReno/pgrm/f77/f77.vax/f77.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)f77.c      5.7 (Berkeley) 4/4/90";
                      9: #endif
                     10: 
                     11: /*
                     12:  * f77.c
                     13:  *
                     14:  * Driver program for the 4.2 BSD f77 compiler.
                     15:  *
                     16:  * University of Utah CS Dept modification history:
                     17:  *
                     18:  * $Log:       f77.c,v $
                     19:  * Revision 5.4  85/12/17  19:12:14  donn
                     20:  * Dynamically allocate buffer; add lint fixes.
                     21:  * 
                     22:  * Revision 5.3  85/11/25  00:00:02  donn
                     23:  * 4.3 beta
                     24:  * 
                     25:  * Revision 5.2  85/08/10  05:16:14  donn
                     26:  * Ifdeffed 66 code, added -r8 flag.  From Jerry Berkman.
                     27:  * 
                     28:  * Revision 5.1  85/08/10  03:32:12  donn
                     29:  * 4.3 alpha
                     30:  * 
                     31:  * Revision 1.14  85/03/01  00:07:57  donn
                     32:  * Portability fix from Ralph Campbell.
                     33:  * 
                     34:  * Revision 1.13  85/02/12  19:31:47  donn
                     35:  * Use CATNAME to get the name of a concatenation command instead of
                     36:  * explicitly running 'cat' -- you can get the wrong 'cat' the old way!
                     37:  * 
                     38:  * Revision 1.12  85/01/14  06:42:30  donn
                     39:  * Changed to call the peephole optimizer with the '-f' flag, so that
                     40:  * floating point moves are translated to integer moves.
                     41:  * 
                     42:  * Revision 1.11  85/01/14  04:38:59  donn
                     43:  * Jerry's change to pass -O to f1 so it knows whether the peephole optimizer
                     44:  * will be run.  This is necessary in order to handle movf/movl translation.
                     45:  * 
                     46:  * Revision 1.10  85/01/14  03:59:12  donn
                     47:  * Added Jerry Berkman's fix for the '-q' flag.
                     48:  * 
                     49:  * Revision 1.9  84/11/09  01:51:26  donn
                     50:  * Cosmetic change to stupid() suggested by John McCarthy at Memorial
                     51:  * University, St. Johns.
                     52:  * 
                     53:  * Revision 1.8  84/09/14  16:02:34  donn
                     54:  * Added changes to notice when people do 'f77 -c foo.f -o bar.o' and tell
                     55:  * them why it doesn't do what they think it does.
                     56:  * 
                     57:  * Revision 1.7  84/08/24  21:08:31  donn
                     58:  * Added call to setrlimit() to prevent core dumps when not debugging.
                     59:  * Reorganized the include file arrangment somewhat.
                     60:  * 
                     61:  * Revision 1.6  84/08/24  20:20:24  donn
                     62:  * Changed stupidity check on Jerry Berkman's suggestion -- now it balks if
                     63:  * the load file exists and has a sensitive suffix.
                     64:  * 
                     65:  * Revision 1.5  84/08/15  18:56:44  donn
                     66:  * Added test for -O combined with -g, suggested by Raleigh Romine.  To keep
                     67:  * things simple, if both are specified then the second in the list is thrown
                     68:  * out and the user is warned.
                     69:  * 
                     70:  * Revision 1.4  84/08/05  21:33:15  donn
                     71:  * Added stupidity check -- f77 won't load on a file that it's asked to
                     72:  * compile as well.
                     73:  * 
                     74:  * Revision 1.3  84/08/04  22:58:24  donn
                     75:  * Improved error reporting -- we now explain why we died and what we did.
                     76:  * Only works on 4.2.  Added at the instigation of Jerry Berkman.
                     77:  * 
                     78:  * Revision 1.2  84/07/28  13:11:24  donn
                     79:  * Added Ralph Campbell's changes to reduce offsets to data.
                     80:  * 
                     81:  */
                     82: 
                     83: char *xxxvers = "\n@(#) F77 DRIVER, VERSION 4.2,   1984 JULY 28\n";
                     84: #include <sys/types.h>
                     85: #include <sys/stat.h>
                     86: #include <sys/signal.h>
                     87: #include <ctype.h>
                     88: #include <stdio.h>
                     89: 
                     90: #ifdef SIGPROF
                     91: /*
                     92:  * Some 4.2 BSD capabilities.
                     93:  */
                     94: #include <sys/time.h>
                     95: #include <sys/resource.h>
                     96: #define        NOCORE          1
                     97: #include <sys/wait.h>
                     98: #define PSIGNAL                1
                     99: #endif
                    100: 
                    101: #include "defines.h"
                    102: #include "machdefs.h"
                    103: #include "pathnames.h"
                    104: #include "version.h"
                    105: 
                    106: static FILEP diagfile  = {stderr} ;
                    107: static int pid;
                    108: static int sigivalue   = 0;
                    109: static int sigqvalue   = 0;
                    110: static int sighvalue   = 0;
                    111: static int sigtvalue   = 0;
                    112: 
                    113: static char *pass1name = PASS1NAME ;
                    114: static char *pass2name = PASS2NAME ;
                    115: static char *pass2opt  = PASS2OPT ;
                    116: static char *asmname   = ASMNAME ;
                    117: static char *ldname    = LDNAME ;
                    118: static char *footname  = FOOTNAME;
                    119: static char *proffoot  = PROFFOOT;
                    120: static char *macroname = "m4";
                    121: static char *shellname = _PATH_BSHELL;
                    122: static char *cppname   = _PATH_CPP;
                    123: static char *aoutname  = "a.out" ;
                    124: static char *temppref  = TEMPPREF;
                    125: 
                    126: static char *infname;
                    127: static char textfname[44];
                    128: static char asmfname[44];
                    129: static char asmpass2[44];
                    130: static char initfname[44];
                    131: static char sortfname[44];
                    132: static char prepfname[44];
                    133: static char objfdefault[44];
                    134: static char optzfname[44];
                    135: static char setfname[44];
                    136: 
                    137: static char fflags[50] = "-";
                    138: static char f2flags[50];
                    139: static char cflags[50] = "-c";
                    140: #if TARGET == GCOS
                    141:        static char eflags[30]  = "system=gcos ";
                    142: #else
                    143:        static char eflags[30]  = "system=unix ";
                    144: #endif
                    145: static char rflags[30] = "";
                    146: static char lflag[3]   = "-x";
                    147: static char *fflagp    = fflags+1;
                    148: static char *f2flagp   = f2flags;
                    149: static char *eflagp    = eflags+12;
                    150: static char *rflagp    = rflags;
                    151: static char *cppflags  = "";
                    152: static char **cppargs;
                    153: static char **loadargs;
                    154: static char **loadp;
                    155: 
                    156: static flag erred      = NO;
                    157: static flag loadflag   = YES;
                    158: static flag saveasmflag        = NO;
                    159: static flag profileflag        = NO;
                    160: static flag optimflag  = NO;
                    161: static flag debugflag  = NO;
                    162: static flag verbose    = NO;
                    163: static flag fortonly   = NO;
                    164: static flag macroflag  = NO;
                    165: static flag sdbflag    = NO;
                    166: static flag namesflag  = YES;
                    167: 
                    168: #if TARGET == PDP11
                    169: static flag nofloating = NO;
                    170: #endif
                    171: 
                    172: static int ncpp;
                    173: 
                    174: 
                    175: main(argc, argv)
                    176: int argc;
                    177: char **argv;
                    178: {
                    179: register int i, n;
                    180: int c, status;
                    181: char *setdoto(), *lastchar(), *lastfield(), *copys(), *argvtos();
                    182: ptr ckalloc();
                    183: char *strcat();
                    184: register char *s;
                    185: char fortfile[20], *t;
                    186: char *buff;
                    187: int intrupt();
                    188: int new_aoutname = NO;
                    189: 
                    190: sigivalue = signal(SIGINT, SIG_IGN) == SIG_IGN;
                    191: sigqvalue = signal(SIGQUIT,SIG_IGN) == SIG_IGN;
                    192: sighvalue = signal(SIGHUP, SIG_IGN) == SIG_IGN;
                    193: sigtvalue = signal(SIGTERM,SIG_IGN) == SIG_IGN;
                    194: enbint(intrupt);
                    195: 
                    196: pid = getpid();
                    197: crfnames();
                    198: 
                    199: cppargs  = (char **) ckalloc( argc * sizeof(*cppargs) );
                    200: loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) );
                    201: loadargs[1] = "-X";
                    202: loadargs[2] = "-u";
                    203: #if HERE==PDP11 || HERE==VAX
                    204:        loadargs[3] = "_MAIN_";
                    205: #endif
                    206: #if HERE == INTERDATA
                    207:        loadargs[3] = "main";
                    208: #endif
                    209: loadp = loadargs + 4;
                    210: 
                    211: --argc;
                    212: ++argv;
                    213: 
                    214: for (i = 0, n = 50; i < argc; ++i)
                    215:        n += strlen(argv[i]) + 1;
                    216: buff = (char *) ckalloc(n);
                    217: 
                    218: while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0')
                    219:        {
                    220:        for(s = argv[0]+1 ; *s ; ++s) switch(*s)
                    221:                {
                    222:                case 'T':  /* use special passes */
                    223:                        switch(*++s)
                    224:                                {
                    225:                                case '1':
                    226:                                        pass1name = s+1; goto endfor;
                    227:                                case '2':
                    228:                                        pass2name = s+1; goto endfor;
                    229:                                case 'p':
                    230:                                        pass2opt = s+1; goto endfor;
                    231:                                case 'a':
                    232:                                        asmname = s+1; goto endfor;
                    233:                                case 'l':
                    234:                                        ldname = s+1; goto endfor;
                    235:                                case 'F':
                    236:                                        footname = s+1; goto endfor;
                    237:                                case 'm':
                    238:                                        macroname = s+1; goto endfor;
                    239:                                case 't':
                    240:                                        temppref = s+1; goto endfor;
                    241:                                default:
                    242:                                        fatali("bad option -T%c", *s);
                    243:                                }
                    244:                        break;
                    245: 
                    246: #ifdef ONLY66
                    247:                case '6':
                    248:                        if(s[1]=='6')
                    249:                                {
                    250:                                *fflagp++ = *s++;
                    251:                                goto copyfflag;
                    252:                                }
                    253:                        else    {
                    254:                                fprintf(diagfile, "invalid flag 6%c\n", s[1]);
                    255:                                done(1);
                    256:                                }
                    257: #endif
                    258: 
                    259:                case 'w':
                    260:                        if(s[1]=='6' && s[2]=='6')
                    261:                                {
                    262:                                *fflagp++ = *s++;
                    263:                                *fflagp++ = *s++;
                    264:                                }
                    265: 
                    266:                copyfflag:
                    267:                case 'u':
                    268:                case 'U':
                    269:                case '1':
                    270:                case 'C':
                    271:                        *fflagp++ = *s;
                    272:                        break;
                    273: 
                    274:                case 'O':
                    275:                        if(sdbflag)
                    276:                                {
                    277:                                fprintf(diagfile, "-O and -g are incompatible; -O ignored\n");
                    278:                                break;
                    279:                                }
                    280:                        optimflag = YES;
                    281:                        *f2flagp++ = '-';
                    282:                        *f2flagp++ = 'O';
                    283:                        *f2flagp++ = ' ';
                    284: #if TARGET == INTERDATA
                    285:                                *loadp++ = "-r";
                    286:                                *loadp++ = "-d";
                    287: #endif
                    288:                        *fflagp++ = 'O';
                    289:                        break;
                    290: 
                    291:                case 'N':
                    292:                        *fflagp++ = 'N';
                    293:                        if( oneof(*++s, "qxscn") )
                    294:                                *fflagp++ = *s++;
                    295:                        else    {
                    296:                                fprintf(diagfile, "invalid flag -N%c\n", *s);
                    297:                                done(1);
                    298:                                }
                    299:                        while( isdigit(*s) )
                    300:                                *fflagp++ = *s++;
                    301:                        *fflagp++ = 'X';
                    302:                        goto endfor;
                    303: 
                    304:                case 'm':
                    305:                        if(s[1] == '4')
                    306:                                ++s;
                    307:                        macroflag = YES;
                    308:                        break;
                    309: 
                    310:                case 'S':
                    311:                        (void) strcat(cflags, " -S");
                    312:                        saveasmflag = YES;
                    313: 
                    314:                case 'c':
                    315:                        if( new_aoutname == YES ){
                    316:                                fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
                    317:                                new_aoutname = NO;
                    318:                                }
                    319:                        loadflag = NO;
                    320:                        break;
                    321: 
                    322:                case 'v':
                    323:                        verbose = YES;
                    324:                        fprintf(diagfile,"\nBerkeley F77, version %s\n",
                    325:                                VERSIONNUMBER);
                    326:                        break;
                    327: 
                    328:                case 'd':
                    329:                        debugflag = YES;
                    330:                        *fflagp++ = 'd';
                    331:                        s++;
                    332:                        while( isdigit(*s) || *s == ',' )
                    333:                                *fflagp++ = *s++;
                    334:                        *fflagp++ = 'X';
                    335:                        goto endfor;
                    336: 
                    337:                case 'M':
                    338:                        *loadp++ = "-M";
                    339:                        break;
                    340: 
                    341:                case 'g':
                    342:                        if(optimflag)
                    343:                                {
                    344:                                fprintf(diagfile, "-g and -O are incompatible; -g ignored\n");
                    345:                                break;
                    346:                                }
                    347:                        (void) strcat(cflags," -g");
                    348:                        sdbflag = YES;
                    349:                        goto copyfflag;
                    350: 
                    351:                case 'p':
                    352:                        profileflag = YES;
                    353:                        (void) strcat(cflags," -p");
                    354:                        *fflagp++ = 'p';
                    355:                        if(s[1] == 'g')
                    356:                                {
                    357:                                proffoot = GPRFFOOT;
                    358:                                s++;
                    359:                                }
                    360:                        break;
                    361: 
                    362:                case 'q':
                    363:                        namesflag = NO;
                    364:                        *fflagp++ = *s;
                    365:                        break;
                    366: 
                    367:                case 'o':
                    368:                        if( ! strcmp(s, "onetrip") )
                    369:                                {
                    370:                                *fflagp++ = '1';
                    371:                                goto endfor;
                    372:                                }
                    373:                        new_aoutname = YES;
                    374:                        aoutname = *++argv;
                    375:                        --argc;
                    376:                        if( loadflag == NO ){
                    377:                                fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
                    378:                                new_aoutname = NO;
                    379:                                }
                    380:                        break;
                    381: 
                    382: #if TARGET == PDP11
                    383:                case 'f':
                    384:                        nofloating = YES;
                    385:                        pass2name = NOFLPASS2;
                    386:                break;
                    387: #endif
                    388: 
                    389:                case 'F':
                    390:                        fortonly = YES;
                    391:                        loadflag = NO;
                    392:                        break;
                    393:                case 'D':
                    394:                case 'I':
                    395:                        cppargs[ncpp++] = *argv;
                    396:                        goto endfor;
                    397: 
                    398:                case 'i':
                    399:                        if((s[1]=='2' || s[1]=='4') && s[2] == '\0')
                    400:                                {
                    401:                                *fflagp++ = *s++;
                    402:                                goto copyfflag;
                    403:                                }
                    404:                        fprintf(diagfile, "invalid flag -i%c\n", s[1]);
                    405:                        done(1);
                    406: 
                    407:                case 'r':       /* -r8 - double the precision */
                    408:                        if(s[1] == '8' && s[2] == '\0')
                    409:                                {
                    410:                                s++;
                    411:                                goto copyfflag;
                    412:                                }
                    413:                        else
                    414:                                {
                    415:                                *loadp++ = "-r";
                    416:                                break;
                    417:                                }
                    418: 
                    419:                case 'l':       /* letter ell--library */
                    420:                        s[-1] = '-';
                    421:                        *loadp++ = s-1;
                    422:                        goto endfor;
                    423: 
                    424:                case 'E':       /* EFL flag argument */
                    425:                        while( *eflagp++ = *++s)
                    426:                                ;
                    427:                        *eflagp++ = ' ';
                    428:                        goto endfor;
                    429:                case 'R':
                    430:                        while( *rflagp++ = *++s )
                    431:                                ;
                    432:                        *rflagp++ = ' ';
                    433:                        goto endfor;
                    434:                default:
                    435:                        lflag[1] = *s;
                    436:                        *loadp++ = copys(lflag);
                    437:                        break;
                    438:                }
                    439: endfor:
                    440:        --argc;
                    441:        ++argv;
                    442:        }
                    443: 
                    444: #ifdef NOCORE
                    445: if(!debugflag)
                    446:        {
                    447:        struct rlimit r;
                    448: 
                    449:        r.rlim_cur = r.rlim_max = 0;
                    450:        (void) setrlimit(RLIMIT_CORE, &r);
                    451:        }
                    452: #endif NOCORE
                    453: 
                    454: *fflagp = '\0';
                    455: 
                    456: if (ncpp > 0)
                    457:        cppflags = argvtos (ncpp,cppargs);
                    458: 
                    459: loadargs[0] = ldname;
                    460: #if TARGET == PDP11
                    461:        if(nofloating)
                    462:                *loadp++ = (profileflag ? NOFLPROF : NOFLFOOT);
                    463:        else
                    464: #endif
                    465: *loadp++ = (profileflag ? proffoot : footname);
                    466: 
                    467: for(i = 0 ; i<argc ; ++i)
                    468:        switch(c =  dotchar(infname = argv[i]) )
                    469:                {
                    470:                case 'r':       /* Ratfor file */
                    471:                case 'e':       /* EFL file */
                    472:                        if( unreadable(argv[i]) )
                    473:                                {
                    474:                                erred = YES;
                    475:                                break;
                    476:                                }
                    477:                        s = fortfile;
                    478:                        t = lastfield(argv[i]);
                    479:                        while( *s++ = *t++)
                    480:                                ;
                    481:                        s[-2] = 'f';
                    482: 
                    483:                        if(macroflag)
                    484:                                {
                    485:                                sprintf(buff, "%s %s >%s", macroname, infname, prepfname);
                    486:                                if( sys(buff) )
                    487:                                        {
                    488:                                        rmf(prepfname);
                    489:                                        erred = YES;
                    490:                                        break;
                    491:                                        }
                    492:                                infname = prepfname;
                    493:                                }
                    494: 
                    495:                        if(c == 'e')
                    496:                                sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile);
                    497:                        else
                    498:                                sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile);
                    499:                        status = sys(buff);
                    500:                        if(macroflag)
                    501:                                rmf(infname);
                    502:                        if(status)
                    503:                                {
                    504:                                erred = YES;
                    505:                                rmf(fortfile);
                    506:                                break;
                    507:                                }
                    508: 
                    509:                        if( ! fortonly )
                    510:                                {
                    511:                                infname = argv[i] = lastfield(argv[i]);
                    512:                                *lastchar(infname) = 'f';
                    513:        
                    514:                                if( dofort(argv[i]) )
                    515:                                        erred = YES;
                    516:                                else    {
                    517:                                        if( nodup(t = setdoto(argv[i])) )
                    518:                                                *loadp++ = t;
                    519:                                        rmf(fortfile);
                    520:                                        }
                    521:                                }
                    522:                        break;
                    523: 
                    524:                case 'F':       /* C preprocessor -> Fortran file */
                    525:                        if( unreadable(argv[i]) )
                    526:                                {
                    527:                                erred = YES;
                    528:                                break;
                    529:                                }
                    530:                        s = fortfile;
                    531:                        t = lastfield(argv[i]);
                    532:                        while( *s++ = *t++)
                    533:                                ;
                    534:                        s[-2] = 'f';
                    535:                        sprintf(buff,"%s %s %s >%s", cppname, cppflags, infname, fortfile);
                    536:                        status = sys(buff);
                    537:                        if(status)
                    538:                                {
                    539:                                erred = YES;
                    540:                                rmf(fortfile);
                    541:                                break;
                    542:                                }
                    543: 
                    544:                        if( ! fortonly )
                    545:                                {
                    546:                                infname = argv[i] = lastfield(argv[i]);
                    547:                                *lastchar(infname) = 'f';
                    548: 
                    549:                                if ( dofort(argv[i]) )
                    550:                                        erred = YES;
                    551:                                else    {
                    552:                                        if (nodup(t = setdoto(argv[i])) )
                    553:                                                *loadp++ = t;
                    554:                                                rmf(fortfile);
                    555:                                                }
                    556:                                }
                    557:                        break;
                    558: 
                    559:                case 'f':       /* Fortran file */
                    560:                        if( unreadable(argv[i]) )
                    561:                                erred = YES;
                    562:                        else if( dofort(argv[i]) )
                    563:                                erred = YES;
                    564:                        else if( nodup(t=setdoto(argv[i])) )
                    565:                                *loadp++ = t;
                    566:                        break;
                    567: 
                    568:                case 'c':       /* C file */
                    569:                case 's':       /* Assembler file */
                    570:                        if( unreadable(argv[i]) )
                    571:                                {
                    572:                                erred = YES;
                    573:                                break;
                    574:                                }
                    575: #if HERE==PDP11 || HERE==VAX
                    576:                        if( namesflag == YES )
                    577:                                fprintf(diagfile, "%s:\n", argv[i]);
                    578: #endif
                    579:                        sprintf(buff, "cc %s %s", cflags, argv[i] );
                    580:                        if( sys(buff) )
                    581:                                erred = YES;
                    582:                        else
                    583:                                if( nodup(t = setdoto(argv[i])) )
                    584:                                        *loadp++ = t;
                    585:                        break;
                    586: 
                    587:                case 'o':
                    588:                        if( nodup(argv[i]) )
                    589:                                *loadp++ = argv[i];
                    590:                        break;
                    591: 
                    592:                default:
                    593:                        if( ! strcmp(argv[i], "-o") ) {
                    594:                                aoutname = argv[++i];
                    595:                                new_aoutname = YES;
                    596:                                if( loadflag == NO ){
                    597:                                        fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
                    598:                                        new_aoutname = NO;
                    599:                                        }
                    600:                        } else
                    601:                                *loadp++ = argv[i];
                    602:                        break;
                    603:                }
                    604: 
                    605: if( loadflag && stupid(aoutname) )
                    606:        erred = YES;
                    607: if(loadflag && !erred)
                    608:        doload(loadargs, loadp);
                    609: done(erred);
                    610: }
                    611: 
                    612: 
                    613: 
                    614: /*
                    615:  * argvtos() copies a list of arguments contained in an array of character
                    616:  * strings to a single dynamically allocated string. Each argument is
                    617:  * separated by one blank space. Returns a pointer to the string or null
                    618:  * if out of memory.
                    619:  */
                    620: #define SBUFINCR       1024
                    621: #define SBUFMAX                10240
                    622: 
                    623: char *
                    624: argvtos(argc, argv)
                    625:        char **argv;
                    626:        int  argc;
                    627: {
                    628:        register char *s;               /* string pointer */
                    629:        register int  i;                /* string buffer pointer */
                    630:        char *malloc();                 /* memory allocator */
                    631:        char *realloc();                /* increase size of storage */
                    632:        char *sbuf;                     /* string buffer */
                    633:        int nbytes;                     /* bytes of memory required */
                    634:        int nu;                         /* no. of SBUFINCR units required */
                    635:        int sbufsize;                   /* current size of sbuf */
                    636:        int strlen();                   /* string length */
                    637: 
                    638:        sbufsize = SBUFINCR;
                    639:        if ((sbuf = malloc((unsigned)sbufsize)) == NULL)
                    640:                {
                    641:                fatal("out of memory (argvtos)");
                    642:                /* NOTREACHED */
                    643:                }
                    644:        
                    645:        for (i = 0; argc-- > 0; ++argv)
                    646:                {
                    647:                if ((nbytes = (i+strlen(*argv)+1-sbufsize)) > 0)
                    648:                        {
                    649:                        nu = (nbytes+SBUFINCR-1)/SBUFINCR;
                    650:                        sbufsize += nu * SBUFINCR;
                    651:                        if (sbufsize > SBUFMAX)
                    652:                                {
                    653:                                fatal("argument length exceeded (argvtos)");
                    654:                                /* NOTREACHED */
                    655:                                }
                    656:                        if ((sbuf = realloc(sbuf, (unsigned)sbufsize)) == NULL)
                    657:                                {
                    658:                                fatal("out of memory (argvtos)");
                    659:                                /* NOTREACHED */
                    660:                                }
                    661:                        }
                    662:                for (s = *argv; *s != '\0'; i++, s++)
                    663:                        sbuf[i] = *s;
                    664:                sbuf[i++] = ' ';
                    665:                }
                    666:        sbuf[--i] = '\0';
                    667:        return(sbuf);
                    668: }
                    669: 
                    670: dofort(s)
                    671: char *s;
                    672: {
                    673: int retcode;
                    674: char buff[200];
                    675: 
                    676: infname = s;
                    677: sprintf(buff, "%s %s %s %s %s %s",
                    678:        pass1name, fflags, s, asmfname, initfname, textfname);
                    679: switch( sys(buff) )
                    680:        {
                    681:        case 1:
                    682:                goto error;
                    683:        case 0:
                    684:                break;
                    685:        default:
                    686:                goto comperror;
                    687:        }
                    688: 
                    689: if( dopass2() )
                    690:        goto comperror;
                    691: doasm(s);
                    692: retcode = 0;
                    693: 
                    694: ret:
                    695:        rmf(asmfname);
                    696:        rmf(initfname);
                    697:        rmf(textfname);
                    698:        return(retcode);
                    699: 
                    700: error:
                    701:        fprintf(diagfile, "\nError.  No assembly.\n");
                    702:        retcode = 1;
                    703:        goto ret;
                    704: 
                    705: comperror:
                    706:        fprintf(diagfile, "\ncompiler error.\n");
                    707:        retcode = 2;
                    708:        goto ret;
                    709: }
                    710: 
                    711: 
                    712: 
                    713: 
                    714: dopass2()
                    715: {
                    716: char buff[100];
                    717: 
                    718: if(verbose)
                    719:        fprintf(diagfile, "PASS2.");
                    720: 
                    721: #if FAMILY==DMR
                    722:        sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2);
                    723:        return( sys(buff) );
                    724: #endif
                    725: 
                    726: 
                    727: #if FAMILY == PCC
                    728: #      if TARGET==INTERDATA
                    729:        sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);
                    730: #      else
                    731:        sprintf(buff, "%s %s %s >%s",
                    732:                pass2name, f2flags, textfname, asmpass2);
                    733: #      endif
                    734:        return( sys(buff) );
                    735: #endif
                    736: }
                    737: 
                    738: 
                    739: 
                    740: 
                    741: doasm(s)
                    742: char *s;
                    743: {
                    744: register char *lastc;
                    745: char *obj;
                    746: char buff[200];
                    747: char *lastchar(), *setdoto();
                    748: 
                    749: if(*s == '\0')
                    750:        s = objfdefault;
                    751: lastc = lastchar(s);
                    752: obj = setdoto(s);
                    753: 
                    754: #if TARGET==PDP11 || TARGET==VAX
                    755: #      ifdef PASS2OPT
                    756:        if(optimflag)
                    757:                {
                    758:                sprintf(buff, "%s -f %s %s", pass2opt, asmpass2, optzfname);
                    759:                if( sys(buff) )
                    760:                        rmf(optzfname);
                    761:                else
                    762:                        if (rename(optzfname, asmpass2))
                    763:                                fatal("can't rename optimizer output file");
                    764:                }
                    765: #      endif
                    766: #endif
                    767: 
                    768: if(saveasmflag)
                    769:        {
                    770:        *lastc = 's';
                    771: #if TARGET == INTERDATA
                    772:        sprintf(buff, "%s %s %s %s %s >%s", CATNAME, asmfname, initfname,
                    773:                setfname, asmpass2, obj);
                    774: #else
                    775: #if TARGET == VAX
                    776:        if (sdbflag)
                    777:                sprintf(buff, "%s %s %s %s >%s",
                    778:                        CATNAME, asmfname, asmpass2, initfname, obj);
                    779:        else
                    780:                sprintf(buff, "%s %s %s %s >%s",
                    781:                        CATNAME, asmfname, initfname, asmpass2, obj);
                    782: #else
                    783:        sprintf(buff, "%s %s %s %s >%s",
                    784:                CATNAME, asmfname, initfname, asmpass2, obj);
                    785: #endif
                    786: #endif
                    787:        if( sys(buff) )
                    788:                fatal("can't concatenate assembly files");
                    789:        *lastc = 'o';
                    790:        }
                    791: else
                    792:        {
                    793:        if(verbose)
                    794:                fprintf(diagfile, "  ASM.");
                    795: #if TARGET == INTERDATA
                    796:        sprintf(buff, "%s -o %s %s %s %s %s", asmname, obj, asmfname,
                    797:                initfname, setfname, asmpass2);
                    798: #endif
                    799: 
                    800: #if TARGET == VAX
                    801:        /* vax assembler currently accepts only one input file */
                    802:        if (sdbflag)
                    803:                sprintf(buff, "%s %s %s >>%s",
                    804:                        CATNAME, asmpass2, initfname, asmfname);
                    805:        else
                    806:                sprintf(buff, "%s %s %s >>%s",
                    807:                        CATNAME, initfname, asmpass2, asmfname);
                    808:        if( sys(buff) )
                    809:                fatal("can't concatenate assembly files");
                    810: #ifdef UCBVAXASM
                    811:        sprintf(buff, "%s -J -o %s %s", asmname, obj, asmfname);
                    812: #else
                    813:        sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);
                    814: #endif
                    815: #endif
                    816: 
                    817: #if TARGET == PDP11
                    818:        sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2);
                    819: #endif
                    820: 
                    821: #if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX
                    822:        sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2);
                    823: #endif
                    824: 
                    825:        if( sys(buff) )
                    826:                fatal("assembler error");
                    827:        if(verbose)
                    828:                fprintf(diagfile, "\n");
                    829: #if HERE==PDP11 && TARGET!=PDP11
                    830:        rmf(obj);
                    831: #endif
                    832:        }
                    833: 
                    834: rmf(asmpass2);
                    835: }
                    836: 
                    837: 
                    838: 
                    839: doload(v0, v)
                    840: register char *v0[], *v[];
                    841: {
                    842: char **p;
                    843: int waitpid;
                    844: 
                    845: if (profileflag)
                    846:        {
                    847:        for(p = p_liblist ; *p ; *v++ = *p++)
                    848:                ;
                    849:        }
                    850: else   {
                    851:        for(p = liblist ; *p ; *v++ = *p++)
                    852:                ;
                    853:        }
                    854: 
                    855: *v++ = "-o";
                    856: *v++ = aoutname;
                    857: *v = NULL;
                    858: 
                    859: if(verbose)
                    860:        fprintf(diagfile, "LOAD.");
                    861: if(debugflag)
                    862:        {
                    863:        for(p = v0 ; p<v ; ++p)
                    864:                fprintf(diagfile, "%s ", *p);
                    865:        fprintf(diagfile, "\n");
                    866:        }
                    867: 
                    868: #if HERE==PDP11 || HERE==INTERDATA || HERE==VAX
                    869:        if( (waitpid = fork()) == 0)
                    870:                {
                    871:                enbint(SIG_DFL);
                    872:                execv(ldname, v0);
                    873:                fatalstr("couldn't load %s", ldname);
                    874:                }
                    875:        if( await(waitpid) )
                    876:                erred = YES;
                    877: #endif
                    878: 
                    879: #if HERE==INTERDATA
                    880:        if(optimflag)
                    881:                {
                    882:                char buff1[100], buff2[100];
                    883:                sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid);
                    884:                sprintf(buff2, "mv junk.%d %s", pid, aoutname);
                    885:                if( sys(buff1) || sys(buff2) )
                    886:                        err("bad optimization");
                    887:                }
                    888: #endif
                    889: 
                    890: if(verbose)
                    891:        fprintf(diagfile, "\n");
                    892: }
                    893: 
                    894: /* Process control and Shell-simulating routines */
                    895: 
                    896: sys(str)
                    897: char *str;
                    898: {
                    899: register char *s, *t;
                    900: char *argv[100];
                    901: char *inname, *outname;
                    902: int append;
                    903: int waitpid;
                    904: int argc;
                    905: 
                    906: 
                    907: if(debugflag)
                    908:        fprintf(diagfile, "%s\n", str);
                    909: inname  = NULL;
                    910: outname = NULL;
                    911: argv[0] = shellname;
                    912: argc = 1;
                    913: 
                    914: t = str;
                    915: while( isspace(*t) )
                    916:        ++t;
                    917: while(*t)
                    918:        {
                    919:        if(*t == '<')
                    920:                inname = t+1;
                    921:        else if(*t == '>')
                    922:                {
                    923:                if(t[1] == '>')
                    924:                        {
                    925:                        append = YES;
                    926:                        outname = t+2;
                    927:                        }
                    928:                else    {
                    929:                        append = NO;
                    930:                        outname = t+1;
                    931:                        }
                    932:                }
                    933:        else
                    934:                argv[argc++] = t;
                    935:        while( !isspace(*t) && *t!='\0' )
                    936:                ++t;
                    937:        if(*t)
                    938:                {
                    939:                *t++ = '\0';
                    940:                while( isspace(*t) )
                    941:                        ++t;
                    942:                }
                    943:        }
                    944: 
                    945: if(argc == 1)   /* no command */
                    946:        return(-1);
                    947: argv[argc] = 0;
                    948: 
                    949: if((waitpid = fork()) == 0)
                    950:        {
                    951:        if(inname)
                    952:                if(freopen(inname, "r", stdin) == NULL)
                    953:                        fatalstr("Cannot open %s", inname);
                    954:        if(outname)
                    955:                if(freopen(outname, (append ? "a" : "w"), stdout) == NULL)
                    956:                        fatalstr("Cannot open %s", outname);
                    957:        enbint(SIG_DFL);
                    958: 
                    959:        texec(argv[1], argv);
                    960: 
                    961:        fatalstr("Cannot load %s", argv[1]);
                    962:        }
                    963: 
                    964: return( await(waitpid) );
                    965: }
                    966: 
                    967: 
                    968: 
                    969: 
                    970: 
                    971: #include "errno.h"
                    972: 
                    973: /* modified version from the Shell */
                    974: texec(f, av)
                    975: char *f;
                    976: char **av;
                    977: {
                    978: extern int errno;
                    979: 
                    980: execv(f, av+1);
                    981: 
                    982: if (errno==ENOEXEC)
                    983:        {
                    984:        av[1] = f;
                    985:        execv(shellname, av);
                    986:        fatal("No shell!");
                    987:        }
                    988: if (errno==ENOMEM)
                    989:        fatalstr("%s: too large", f);
                    990: }
                    991: 
                    992: 
                    993: 
                    994: 
                    995: 
                    996: 
                    997: done(k)
                    998: int k;
                    999: {
                   1000: static int recurs      = NO;
                   1001: 
                   1002: if(recurs == NO)
                   1003:        {
                   1004:        recurs = YES;
                   1005:        rmfiles();
                   1006:        }
                   1007: exit(k);
                   1008: }
                   1009: 
                   1010: 
                   1011: 
                   1012: 
                   1013: 
                   1014: 
                   1015: enbint(k)
                   1016: int (*k)();
                   1017: {
                   1018: if(sigivalue == 0)
                   1019:        (void) signal(SIGINT,k);
                   1020: if(sigqvalue == 0)
                   1021:        (void) signal(SIGQUIT,k);
                   1022: if(sighvalue == 0)
                   1023:        (void) signal(SIGHUP,k);
                   1024: if(sigtvalue == 0)
                   1025:        (void) signal(SIGTERM,k);
                   1026: }
                   1027: 
                   1028: 
                   1029: 
                   1030: 
                   1031: intrupt()
                   1032: {
                   1033: done(2);
                   1034: }
                   1035: 
                   1036: 
                   1037: #ifdef PSIGNAL
                   1038: /*
                   1039:  * Fancy 4.2 BSD signal printing stuff.
                   1040:  */
                   1041: char harmless[NSIG] = { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 };
                   1042: #endif
                   1043: 
                   1044: 
                   1045: await(waitpid)
                   1046: int waitpid;
                   1047: {
                   1048: 
                   1049: #ifdef PSIGNAL
                   1050: extern char *sys_siglist[];
                   1051: union wait status;
                   1052: #else PSIGNAL
                   1053: int status;
                   1054: #endif PSIGNAL
                   1055: 
                   1056: int w;
                   1057: 
                   1058: enbint(SIG_IGN);
                   1059: while ( (w = wait(&status)) != waitpid)
                   1060:        if(w == -1)
                   1061:                fatal("bad wait code");
                   1062: enbint(intrupt);
                   1063: 
                   1064: #ifdef PSIGNAL
                   1065: if(status.w_termsig)
                   1066:        {
                   1067:        debugflag = 0;  /* Prevent us from dumping core ourselves */
                   1068:        if(status.w_termsig != SIGINT && status.w_termsig < NSIG)
                   1069:                fprintf(diagfile, "%s%s\n", sys_siglist[status.w_termsig],
                   1070:                        status.w_coredump ? " -- core dumped" : "");
                   1071:        if(status.w_termsig < NSIG && ! harmless[status.w_termsig])
                   1072:                fatal("see a system manager");
                   1073:        else
                   1074:                done(3);
                   1075:        }
                   1076: return(status.w_retcode);
                   1077: #else PSIGNAL
                   1078: if(status & 0377)
                   1079:        {
                   1080:        if(status != SIGINT)
                   1081:                fprintf(diagfile, "Termination code %d\n", status);
                   1082:        done(3);
                   1083:        }
                   1084: return(status>>8);
                   1085: #endif PSIGNAL
                   1086: }
                   1087: 
                   1088: /* File Name and File Manipulation Routines */
                   1089: 
                   1090: unreadable(s)
                   1091: register char *s;
                   1092: {
                   1093: register FILE *fp;
                   1094: 
                   1095: if(fp = fopen(s, "r"))
                   1096:        {
                   1097:        fclose(fp);
                   1098:        return(NO);
                   1099:        }
                   1100: 
                   1101: else
                   1102:        {
                   1103:        fprintf(diagfile, "Error: Cannot read file %s\n", s);
                   1104:        return(YES);
                   1105:        }
                   1106: }
                   1107: 
                   1108: 
                   1109: 
                   1110: stupid(s)
                   1111: char *s;
                   1112: {
                   1113: char c;
                   1114: extern char *index();
                   1115: 
                   1116: if( (c = dotchar(s))
                   1117:   && index("focsreF", c)
                   1118:   && access(s, 0) == 0 )
                   1119:        {
                   1120:        fprintf(diagfile, "Loading on %s would destroy it\n", s);
                   1121:        return(YES);
                   1122:        }
                   1123: return(NO);
                   1124: }
                   1125: 
                   1126: 
                   1127: 
                   1128: clf(p)
                   1129: FILEP *p;
                   1130: {
                   1131: if(p!=NULL && *p!=NULL && *p!=stdout)
                   1132:        {
                   1133:        if(ferror(*p))
                   1134:                fatal("writing error");
                   1135:        fclose(*p);
                   1136:        }
                   1137: *p = NULL;
                   1138: }
                   1139: 
                   1140: rmfiles()
                   1141: {
                   1142: rmf(textfname);
                   1143: rmf(asmfname);
                   1144: rmf(initfname);
                   1145: rmf(asmpass2);
                   1146: #if TARGET == INTERDATA
                   1147:        rmf(setfname);
                   1148: #endif
                   1149: }
                   1150: 
                   1151: 
                   1152: 
                   1153: 
                   1154: 
                   1155: 
                   1156: 
                   1157: 
                   1158: /* return -1 if file does not exist, 0 if it is of zero length
                   1159:    and 1 if of positive length
                   1160: */
                   1161: content(filename)
                   1162: char *filename;
                   1163: {
                   1164: #ifdef VERSION6
                   1165:        struct stat
                   1166:                {
                   1167:                char cjunk[9];
                   1168:                char size0;
                   1169:                int size1;
                   1170:                int ijunk[12];
                   1171:                } buf;
                   1172: #else
                   1173:        struct stat buf;
                   1174: #endif
                   1175: 
                   1176: if(stat(filename,&buf) < 0)
                   1177:        return(-1);
                   1178: #ifdef VERSION6
                   1179:        return(buf.size0 || buf.size1);
                   1180: #else
                   1181:        return( buf.st_size > 0 );
                   1182: #endif
                   1183: }
                   1184: 
                   1185: 
                   1186: 
                   1187: 
                   1188: crfnames()
                   1189: {
                   1190: fname(textfname, "x");
                   1191: fname(asmfname, "s");
                   1192: fname(asmpass2, "a");
                   1193: fname(initfname, "d");
                   1194: fname(sortfname, "S");
                   1195: fname(objfdefault, "o");
                   1196: fname(prepfname, "p");
                   1197: fname(optzfname, "z");
                   1198: fname(setfname, "A");
                   1199: }
                   1200: 
                   1201: 
                   1202: 
                   1203: 
                   1204: rmf(fn)
                   1205: register char *fn;
                   1206: {
                   1207: /* if(!debugflag && fn!=NULL && *fn!='\0') */
                   1208: 
                   1209: if(fn!=NULL && *fn!='\0')
                   1210:        unlink(fn);
                   1211: }
                   1212: 
                   1213: 
                   1214: 
                   1215: 
                   1216: 
                   1217: LOCAL fname(name, suff)
                   1218: char *name, *suff;
                   1219: {
                   1220: sprintf(name, "%s/%s%d.%s", _PATH_TMP, temppref, pid, suff);
                   1221: }
                   1222: 
                   1223: 
                   1224: 
                   1225: 
                   1226: dotchar(s)
                   1227: register char *s;
                   1228: {
                   1229: for( ; *s ; ++s)
                   1230:        if(s[0]=='.' && s[1]!='\0' && s[2]=='\0')
                   1231:                return( s[1] );
                   1232: return(NO);
                   1233: }
                   1234: 
                   1235: 
                   1236: 
                   1237: char *lastfield(s)
                   1238: register char *s;
                   1239: {
                   1240: register char *t;
                   1241: for(t = s; *s ; ++s)
                   1242:        if(*s == '/')
                   1243:                t = s+1;
                   1244: return(t);
                   1245: }
                   1246: 
                   1247: 
                   1248: 
                   1249: char *lastchar(s)
                   1250: register char *s;
                   1251: {
                   1252: while(*s)
                   1253:        ++s;
                   1254: return(s-1);
                   1255: }
                   1256: 
                   1257: char *setdoto(s)
                   1258: register char *s;
                   1259: {
                   1260: *lastchar(s) = 'o';
                   1261: return( lastfield(s) );
                   1262: }
                   1263: 
                   1264: 
                   1265: 
                   1266: badfile(s)
                   1267: char *s;
                   1268: {
                   1269: fatalstr("cannot open intermediate file %s", s);
                   1270: }
                   1271: 
                   1272: 
                   1273: 
                   1274: ptr ckalloc(n)
                   1275: int n;
                   1276: {
                   1277: ptr p;
                   1278: extern char *calloc();
                   1279: 
                   1280: if( p = (ptr) calloc(1, (unsigned) n) )
                   1281:        return(p);
                   1282: 
                   1283: fatal("out of memory");
                   1284: /* NOTREACHED */
                   1285: }
                   1286: 
                   1287: 
                   1288: 
                   1289: 
                   1290: 
                   1291: char *copyn(n, s)
                   1292: register int n;
                   1293: register char *s;
                   1294: {
                   1295: register char *p, *q;
                   1296: 
                   1297: p = q = (char *) ckalloc(n);
                   1298: while(n-- > 0)
                   1299:        *q++ = *s++;
                   1300: return(p);
                   1301: }
                   1302: 
                   1303: 
                   1304: 
                   1305: char *copys(s)
                   1306: char *s;
                   1307: {
                   1308: return( copyn( strlen(s)+1 , s) );
                   1309: }
                   1310: 
                   1311: 
                   1312: 
                   1313: 
                   1314: 
                   1315: oneof(c,s)
                   1316: register c;
                   1317: register char *s;
                   1318: {
                   1319: while( *s )
                   1320:        if(*s++ == c)
                   1321:                return(YES);
                   1322: return(NO);
                   1323: }
                   1324: 
                   1325: 
                   1326: 
                   1327: nodup(s)
                   1328: char *s;
                   1329: {
                   1330: register char **p;
                   1331: 
                   1332: for(p = loadargs ; p < loadp ; ++p)
                   1333:        if( !strcmp(*p, s) )
                   1334:                return(NO);
                   1335: 
                   1336: return(YES);
                   1337: }
                   1338: 
                   1339: 
                   1340: 
                   1341: static fatal(t)
                   1342: char *t;
                   1343: {
                   1344: fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t);
                   1345: if(debugflag)
                   1346:        abort();
                   1347: done(1);
                   1348: exit(1);
                   1349: }
                   1350: 
                   1351: 
                   1352: 
                   1353: 
                   1354: static fatali(t,d)
                   1355: char *t;
                   1356: int d;
                   1357: {
                   1358: char buff[100];
                   1359: sprintf(buff, t, d);
                   1360: fatal(buff);
                   1361: }
                   1362: 
                   1363: 
                   1364: 
                   1365: 
                   1366: static fatalstr(t, s)
                   1367: char *t, *s;
                   1368: {
                   1369: char buff[100];
                   1370: sprintf(buff, t, s);
                   1371: fatal(buff);
                   1372: }
                   1373: err(s)
                   1374: char *s;
                   1375: {
                   1376: fprintf(diagfile, "Error in file %s: %s\n", infname, s);
                   1377: }
                   1378: 

unix.superglobalmegacorp.com

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