Annotation of 43BSDReno/pgrm/f77/f77.vax/f77.c, revision 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.