Annotation of researchv10no/cmd/f77/driver.c, revision 1.1.1.1

1.1       root        1: char xxxvers[] = "\n@(#) FORTRAN 77 DRIVER, VERSION 2.03.7, 27 JUNE 1989\n";
                      2: #include "stdio.h"
                      3: #ifndef NULL
                      4: #include "stddef.h"
                      5: #endif
                      6: #include "ctype.h"
                      7: #include "defines"
                      8: #include "machdefs"
                      9: #include "drivedefs"
                     10: #include "ftypes"
                     11: #include "signal.h"
                     12: 
                     13: static FILEP diagfile  = {
                     14:        stderr};
                     15: static int pid;
                     16: static int sigivalue   = 0;
                     17: static int sigqvalue   = 0;
                     18: static int sighvalue   = 0;
                     19: static int sigtvalue   = 0;
                     20: 
                     21: static char *pass1name = PASS1NAME ;
                     22: static char *pass2name = PASS2NAME ;
                     23: static char *asmname   = ASMNAME ;
                     24: static char *ldname    = LDNAME ;
                     25: static char *footname  = FOOTNAME;
                     26: static char *proffoot  = PROFFOOT;
                     27: static char *macroname = "m4";
                     28: static char *shellname = "/bin/sh";
                     29: static char *aoutname  = "a.out" ;
                     30: static char *temppref  = TEMPPREF;
                     31: 
                     32: static char *infname;
                     33: static char textfname[44];
                     34: static char asmfname[44];
                     35: static char asmpass2[44];
                     36: static char initfname[44];
                     37: static char sortfname[44];
                     38: static char prepfname[44];
                     39: static char objfdefault[44];
                     40: static char optzfname[44];
                     41: static char setfname[44];
                     42: 
                     43: static char fflags[50] = "-";
                     44: static char cflags[50] = "-c";
                     45: #if TARGET == GCOS
                     46: static char eflags[30] = "system=gcos ";
                     47: #else
                     48: static char eflags[30] = "system=unix ";
                     49: #endif
                     50: static char rflags[30] = "";
                     51: static char lflag[3]   = "-x";
                     52: static char *fflagp    = fflags+1;
                     53: static char *eflagp    = eflags+12;
                     54: static char *rflagp    = rflags;
                     55: static char **loadargs;
                     56: static char **loadp;
                     57: 
                     58: static flag erred      = NO;
                     59: static flag loadflag   = YES;
                     60: static flag saveasmflag        = NO;
                     61: static flag profileflag        = NO;
                     62: static flag optimflag  = NO;
                     63: static flag debugflag  = NO;
                     64: static flag verbose    = NO;
                     65: static flag nofloating = NO;
                     66: static flag fortonly   = NO;
                     67: static flag macroflag  = NO;
                     68: static flag sdbflag    = NO;
                     69: 
                     70: static int fatal(), fatali(), fatalstr(), fname();
                     71: 
                     72: 
                     73: main(argc, argv)
                     74: int argc;
                     75: char **argv;
                     76: {
                     77:        int i, c, status;
                     78:        char *setdoto(), *lastchar(), *lastfield(), *copys();
                     79:        ptr ckalloc();
                     80:        register char *s;
                     81:        char fortfile[20], *t;
                     82:        char buff[100];
                     83:        int intrupt();
                     84: 
                     85:        sigivalue = (int) signal(SIGINT, SIG_IGN) & 01;
                     86:        sigqvalue = (int) signal(SIGQUIT,SIG_IGN) & 01;
                     87:        sighvalue = (int) signal(SIGHUP, SIG_IGN) & 01;
                     88:        sigtvalue = (int) signal(SIGTERM,SIG_IGN) & 01;
                     89:        enbint(intrupt);
                     90: 
                     91:        pid = getpid();
                     92:        crfnames();
                     93: 
                     94:        loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) );
                     95:        loadargs[1] = "-X";
                     96:        loadargs[2] = "-u";
                     97: #if HERE==PDP11 || HERE==VAX
                     98:        loadargs[3] = "_MAIN__";
                     99: #endif
                    100: #if HERE == INTERDATA
                    101:        loadargs[3] = "main";
                    102: #endif
                    103:        loadp = loadargs + 4;
                    104: 
                    105:        --argc;
                    106:        ++argv;
                    107: 
                    108:        while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0')
                    109:        {
                    110:                for(s = argv[0]+1 ; *s ; ++s) switch(*s)
                    111:                {
                    112:                case 'T':  /* use special passes */
                    113:                        switch(*++s)
                    114:                        {
                    115:                        case '1':
                    116:                                pass1name = s+1; 
                    117:                                goto endfor;
                    118:                        case '2':
                    119:                                pass2name = s+1; 
                    120:                                goto endfor;
                    121:                        case 'a':
                    122:                                asmname = s+1; 
                    123:                                goto endfor;
                    124:                        case 'l':
                    125:                                ldname = s+1; 
                    126:                                goto endfor;
                    127:                        case 'F':
                    128:                                footname = s+1; 
                    129:                                goto endfor;
                    130:                        case 'm':
                    131:                                macroname = s+1; 
                    132:                                goto endfor;
                    133:                        case 't':
                    134:                                temppref = s+1; 
                    135:                                goto endfor;
                    136:                        default:
                    137:                                fatali("bad option -T%c", *s);
                    138:                        }
                    139:                        break;
                    140: 
                    141:                case '6':
                    142:                        if(s[1]=='6')
                    143:                        {
                    144:                                *fflagp++ = *s++;
                    145:                                goto copyfflag;
                    146:                        }
                    147:                        else    {
                    148:                                fprintf(diagfile, "invalid flag 6%c\n", s[1]);
                    149:                                done(1);
                    150:                        }
                    151: 
                    152:                case 'w':
                    153:                        if(s[1]=='6' && s[2]=='6')
                    154:                        {
                    155:                                *fflagp++ = *s++;
                    156:                                *fflagp++ = *s++;
                    157:                        }
                    158: 
                    159: copyfflag:
                    160:                case 'b':
                    161:                case 'B':
                    162:                case 'u':
                    163:                case 'U':
                    164:                case '1':
                    165:                case 'C':
                    166:                        *fflagp++ = *s;
                    167:                        break;
                    168: 
                    169:                case 'O':
                    170:                        optimflag = YES;
                    171: #if TARGET == INTERDATA
                    172:                        *loadp++ = "-r";
                    173:                        *loadp++ = "-d";
                    174: #endif
                    175:                        *fflagp++ = 'O';
                    176:                        if( isdigit(s[1]) )
                    177:                                *fflagp++ = *++s;
                    178:                        break;
                    179: 
                    180:                case 'N':
                    181:                        *fflagp++ = 'N';
                    182:                        if( oneof(*++s, "qxscn") )
                    183:                                *fflagp++ = *s++;
                    184:                        else    {
                    185:                                fprintf(diagfile, "invalid flag -N%c\n", *s);
                    186:                                done(1);
                    187:                        }
                    188:                        while( isdigit(*s) )
                    189:                                *fflagp++ = *s++;
                    190:                        *fflagp++ = 'X';
                    191:                        goto endfor;
                    192: 
                    193:                case 'm':
                    194:                        if(s[1] == '4')
                    195:                                ++s;
                    196:                        macroflag = YES;
                    197:                        break;
                    198: 
                    199:                case 'S':
                    200:                        strcat(cflags, " -S");
                    201:                        saveasmflag = YES;
                    202: 
                    203:                case 'c':
                    204:                        loadflag = NO;
                    205:                        break;
                    206: 
                    207:                case 'v':
                    208:                        verbose = YES;
                    209:                        break;
                    210: 
                    211:                case 'd':
                    212:                        debugflag = YES;
                    213:                        goto copyfflag;
                    214: 
                    215:                case 'M':
                    216:                        *loadp++ = "-M";
                    217:                        break;
                    218: 
                    219:                case 'g':
                    220:                        strcat(cflags," -g");
                    221:                        sdbflag = YES;
                    222:                        goto copyfflag;
                    223: 
                    224:                case 'p':
                    225:                        profileflag = YES;
                    226:                        strcat(cflags," -p");
                    227:                        goto copyfflag;
                    228: 
                    229:                case 'o':
                    230:                        if( ! strcmp(s, "onetrip") )
                    231:                        {
                    232:                                *fflagp++ = '1';
                    233:                                goto endfor;
                    234:                        }
                    235:                        aoutname = *++argv;
                    236:                        --argc;
                    237:                        break;
                    238: 
                    239: #if TARGET == PDP11
                    240:                case 'f':
                    241:                        nofloating = YES;
                    242:                        pass2name = NOFLPASS2;
                    243:                        break;
                    244: #endif
                    245: 
                    246:                case 'F':
                    247:                        fortonly = YES;
                    248:                        loadflag = NO;
                    249:                        break;
                    250: 
                    251:                case 'I':
                    252:                        if(s[1]=='2' || s[1]=='4' || s[1]=='s')
                    253:                        {
                    254:                                *fflagp++ = *s++;
                    255:                                goto copyfflag;
                    256:                        }
                    257:                        fprintf(diagfile, "invalid flag -I%c\n", s[1]);
                    258:                        done(1);
                    259: 
                    260:                case 'l':       /* letter ell--library */
                    261:                        s[-1] = '-';
                    262:                        *loadp++ = s-1;
                    263:                        goto endfor;
                    264: 
                    265:                case 'E':       /* EFL flag argument */
                    266:                        while( *eflagp++ = *++s)
                    267:                                ;
                    268:                        *eflagp++ = ' ';
                    269:                        goto endfor;
                    270:                case 'R':
                    271:                        while( *rflagp++ = *++s )
                    272:                                ;
                    273:                        *rflagp++ = ' ';
                    274:                        goto endfor;
                    275:                default:
                    276:                        lflag[1] = *s;
                    277:                        *loadp++ = copys(lflag);
                    278:                        break;
                    279:                }
                    280: endfor:
                    281:                --argc;
                    282:                ++argv;
                    283:        }
                    284: 
                    285:        *fflagp = '\0';
                    286: 
                    287:        loadargs[0] = ldname;
                    288: #if TARGET == PDP11
                    289:        if(nofloating)
                    290:                *loadp++ = (profileflag ? NOFLPROF : NOFLFOOT);
                    291:        else
                    292: #endif
                    293:                *loadp++ = (profileflag ? proffoot : footname);
                    294: 
                    295:        for(i = 0 ; i<argc ; ++i)
                    296:                switch(c =  dotchar(infname = argv[i]) )
                    297:                {
                    298:                case 'r':       /* Ratfor file */
                    299:                case 'e':       /* EFL file */
                    300:                        if( unreadable(argv[i]) )
                    301:                        {
                    302:                                erred = YES;
                    303:                                break;
                    304:                        }
                    305:                        s = fortfile;
                    306:                        t = lastfield(argv[i]);
                    307:                        while( *s++ = *t++)
                    308:                                ;
                    309:                        s[-2] = 'f';
                    310: 
                    311:                        if(macroflag)
                    312:                        {
                    313:                                sprintf(buff, "%s %s >%s", macroname, infname, prepfname);
                    314:                                if( sys(buff) )
                    315:                                {
                    316:                                        rmf(prepfname);
                    317:                                        erred = YES;
                    318:                                        break;
                    319:                                }
                    320:                                infname = prepfname;
                    321:                        }
                    322: 
                    323:                        if(c == 'e')
                    324:                                sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile);
                    325:                        else
                    326:                                sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile);
                    327:                        status = sys(buff);
                    328:                        if(macroflag)
                    329:                                rmf(infname);
                    330:                        if(status)
                    331:                        {
                    332:                                erred = YES;
                    333:                                rmf(fortfile);
                    334:                                break;
                    335:                        }
                    336: 
                    337:                        if( ! fortonly )
                    338:                        {
                    339:                                infname = argv[i] = lastfield(argv[i]);
                    340:                                *lastchar(infname) = 'f';
                    341: 
                    342:                                if( dofort(argv[i]) )
                    343:                                        erred = YES;
                    344:                                else    {
                    345:                                        if( nodup(t = setdoto(argv[i])) )
                    346:                                                *loadp++ = t;
                    347:                                        rmf(fortfile);
                    348:                                }
                    349:                        }
                    350:                        break;
                    351: 
                    352:                case 'f':       /* Fortran file */
                    353:                case 'F':
                    354:                        if( unreadable(argv[i]) )
                    355:                                erred = YES;
                    356:                        else if( dofort(argv[i]) )
                    357:                                erred = YES;
                    358:                        else if( nodup(t=setdoto(argv[i])) )
                    359:                                *loadp++ = t;
                    360:                        break;
                    361: 
                    362:                case 'c':       /* C file */
                    363:                case 's':       /* Assembler file */
                    364:                        if( unreadable(argv[i]) )
                    365:                        {
                    366:                                erred = YES;
                    367:                                break;
                    368:                        }
                    369: #if HERE==PDP11 || HERE==VAX
                    370:                        fprintf(diagfile, "%s:\n", argv[i]);
                    371: #endif
                    372:                        sprintf(buff, "cc %s %s", cflags, argv[i] );
                    373:                        if( sys(buff) )
                    374:                                erred = YES;
                    375:                        else
                    376:                                if( nodup(t = setdoto(argv[i])) )
                    377:                                        *loadp++ = t;
                    378:                        break;
                    379: 
                    380:                case 'o':
                    381:                        if( nodup(argv[i]) )
                    382:                                *loadp++ = argv[i];
                    383:                        break;
                    384: 
                    385:                default:
                    386:                        if( ! strcmp(argv[i], "-o") )
                    387:                                aoutname = argv[++i];
                    388:                        else
                    389:                                *loadp++ = argv[i];
                    390:                        break;
                    391:                }
                    392: 
                    393:        if(loadflag && !erred)
                    394:                doload(loadargs, loadp);
                    395:        done(erred);
                    396: }
                    397: 
                    398: dofort(s)
                    399: char *s;
                    400: {
                    401:        int retcode;
                    402:        char buff[200];
                    403: 
                    404:        infname = s;
                    405:        sprintf(buff, "%s %s %s %s %s %s",
                    406:            pass1name, fflags, s, asmfname, initfname, textfname);
                    407:        switch( sys(buff) )
                    408:        {
                    409:        case 1:
                    410:                goto error;
                    411:        case 0:
                    412:                break;
                    413:        default:
                    414:                goto comperror;
                    415:        }
                    416: 
                    417:        if(content(initfname) > 0)
                    418:                if( dodata() )
                    419:                        goto error;
                    420:        if( dopass2() )
                    421:                goto comperror;
                    422:        doasm(s);
                    423:        retcode = 0;
                    424: 
                    425: ret:
                    426:        rmf(asmfname);
                    427:        rmf(initfname);
                    428:        rmf(textfname);
                    429:        return(retcode);
                    430: 
                    431: error:
                    432:        fprintf(diagfile, "\nError.  No assembly.\n");
                    433:        retcode = 1;
                    434:        goto ret;
                    435: 
                    436: comperror:
                    437:        fprintf(diagfile, "\ncompiler error.\n");
                    438:        retcode = 2;
                    439:        goto ret;
                    440: }
                    441: 
                    442: 
                    443: 
                    444: 
                    445: dopass2()
                    446: {
                    447:        char buff[100];
                    448: 
                    449:        if(verbose)
                    450:                fprintf(diagfile, "PASS2.");
                    451: 
                    452: #if FAMILY==DMR
                    453:        sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2);
                    454:        return( sys(buff) );
                    455: #endif
                    456: 
                    457: #if FAMILY == PCC
                    458: #      if TARGET==INTERDATA
                    459:        sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);
                    460: #      else
                    461:        sprintf(buff, "%s %s >%s", pass2name, textfname, asmpass2);
                    462: #      endif
                    463:        return( sys(buff) );
                    464: #endif
                    465: }
                    466: 
                    467: 
                    468: 
                    469: 
                    470: doasm(s)
                    471: char *s;
                    472: {
                    473:        register char *lastc;
                    474:        char *obj;
                    475:        char buff[200];
                    476:        char *lastchar(), *setdoto();
                    477: 
                    478:        if(*s == '\0')
                    479:                s = objfdefault;
                    480:        lastc = lastchar(s);
                    481:        obj = setdoto(s);
                    482: 
                    483: #if TARGET==PDP11 || TARGET==VAX
                    484: #      ifdef PASS2OPT
                    485:        if(optimflag)
                    486:        {
                    487:                sprintf(buff, "%s %s %s", PASS2OPT, asmpass2, optzfname);
                    488:                if( sys(buff) )
                    489:                        rmf(optzfname);
                    490:                else
                    491:                {
                    492:                        sprintf(buff,"mv %s %s", optzfname, asmpass2);
                    493:                        sys(buff);
                    494:                }
                    495:        }
                    496: #      endif
                    497: #endif
                    498: 
                    499:        if(saveasmflag)
                    500:        {
                    501:                *lastc = 's';
                    502: #if TARGET == INTERDATA
                    503:                sprintf(buff, "cat %s %s %s >%s",asmfname, setfname, asmpass2, obj);
                    504: #else
                    505:                sprintf(buff, "cat %s %s >%s", asmfname, asmpass2, obj);
                    506: #endif
                    507:                sys(buff);
                    508:                *lastc = 'o';
                    509:        }
                    510:        else
                    511:        {
                    512:                if(verbose)
                    513:                        fprintf(diagfile, "  ASM.");
                    514: #if TARGET == INTERDATA
                    515:                sprintf(buff, "%s -o %s %s %s %s", asmname, obj, asmfname, setfname, asmpass2);
                    516: #endif
                    517: 
                    518: #if TARGET == VAX
                    519:                /* vax assembler currently accepts only one input file */
                    520:                sprintf(buff, "cat %s >>%s", asmpass2, asmfname);
                    521:                sys(buff);
                    522:                sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);
                    523: #endif
                    524: 
                    525: #if TARGET == PDP11
                    526:                sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2);
                    527: #endif
                    528: 
                    529: #if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX
                    530:                sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2);
                    531: #endif
                    532: 
                    533:                if( sys(buff) )
                    534:                        fatal("assembler error");
                    535:                if(verbose)
                    536:                        fprintf(diagfile, "\n");
                    537: #if HERE==PDP11 && TARGET!=PDP11
                    538:                rmf(obj);
                    539: #endif
                    540:        }
                    541: 
                    542:        rmf(asmpass2);
                    543: }
                    544: 
                    545: 
                    546: 
                    547: doload(v0, v)
                    548: register char *v0[], *v[];
                    549: {
                    550:        char **p;
                    551:        int waitpid;
                    552: 
                    553:        if(sdbflag)
                    554:                *v++ = "-lsdb";
                    555:        for(p = liblist ; *p ; *v++ = *p++)
                    556:                ;
                    557: 
                    558:        *v++ = "-o";
                    559:        *v++ = aoutname;
                    560:        *v = NULL;
                    561: 
                    562:        if(verbose)
                    563:                fprintf(diagfile, "LOAD.");
                    564:        if(debugflag)
                    565:        {
                    566:                for(p = v0 ; p<v ; ++p)
                    567:                        fprintf(diagfile, "%s ", *p);
                    568:                fprintf(diagfile, "\n");
                    569:        }
                    570: 
                    571: #if HERE==PDP11 || HERE==INTERDATA || HERE==VAX
                    572:        if( (waitpid = fork()) == 0)
                    573:        {
                    574:                enbint(SIG_DFL);
                    575:                execv(ldname, v0);
                    576:                fatalstr("couldn't load %s", ldname);
                    577:        }
                    578:        await(waitpid);
                    579: #endif
                    580: 
                    581: #if HERE==INTERDATA
                    582:        if(optimflag)
                    583:        {
                    584:                char buff1[100], buff2[100];
                    585:                sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid);
                    586:                sprintf(buff2, "mv junk.%d %s", pid, aoutname);
                    587:                if( sys(buff1) || sys(buff2) )
                    588:                        err("bad optimization");
                    589:        }
                    590: #endif
                    591: 
                    592:        if(verbose)
                    593:                fprintf(diagfile, "\n");
                    594: }
                    595: 
                    596: /* Process control and Shell-simulating routines */
                    597: 
                    598: sys(str)
                    599: char *str;
                    600: {
                    601:        register char *s, *t;
                    602:        char *argv[100], path[100];
                    603:        char *inname, *outname;
                    604:        int append;
                    605:        int waitpid;
                    606:        int argc;
                    607: 
                    608: 
                    609:        if(debugflag)
                    610:                fprintf(diagfile, "%s\n", str);
                    611:        /* doug busted freopen, so let's try with system */
                    612:        return(system(str) >> 8);
                    613:        /* NOTREACHED (pjw) */
                    614: #if 0
                    615:        inname  = NULL;
                    616:        outname = NULL;
                    617:        argv[0] = shellname;
                    618:        argc = 1;
                    619: 
                    620:        t = str;
                    621:        while( isspace(*t) )
                    622:                ++t;
                    623:        while(*t)
                    624:        {
                    625:                if(*t == '<')
                    626:                        inname = t+1;
                    627:                else if(*t == '>')
                    628:                {
                    629:                        if(t[1] == '>')
                    630:                        {
                    631:                                append = YES;
                    632:                                outname = t+2;
                    633:                        }
                    634:                        else    {
                    635:                                append = NO;
                    636:                                outname = t+1;
                    637:                        }
                    638:                }
                    639:                else
                    640:                        argv[argc++] = t;
                    641:                while( !isspace(*t) && *t!='\0' )
                    642:                        ++t;
                    643:                if(*t)
                    644:                {
                    645:                        *t++ = '\0';
                    646:                        while( isspace(*t) )
                    647:                                ++t;
                    648:                }
                    649:        }
                    650: 
                    651:        if(argc == 1)   /* no command */
                    652:                return(-1);
                    653:        argv[argc] = 0;
                    654: 
                    655:        s = path;
                    656:        t = "/usr/bin/";
                    657:        while(*t)
                    658:                *s++ = *t++;
                    659:        for(t = argv[1] ; *s++ = *t++ ; )
                    660:                ;
                    661:        if((waitpid = fork()) == 0)
                    662:        {
                    663:                if(inname)
                    664:                        freopen(inname, "r", stdin);
                    665:                if(outname)
                    666:                        freopen(outname, (append ? "a" : "w"), stdout);
                    667:                enbint(SIG_DFL);
                    668: 
                    669:                texec(path+9, argv);  /* command */
                    670:                texec(path+4, argv);  /*  /bin/command */
                    671:                texec(path  , argv);  /* /usr/bin/command */
                    672: 
                    673:                fatalstr("Cannot load %s",path+9);
                    674:        }
                    675: 
                    676:        return( await(waitpid) );
                    677: #endif
                    678: }
                    679: 
                    680: 
                    681: 
                    682: 
                    683: 
                    684: #include "errno.h"
                    685: 
                    686: /* modified version from the Shell */
                    687: texec(f, av)
                    688: char *f;
                    689: char **av;
                    690: {
                    691:        extern int errno;
                    692: 
                    693:        execv(f, av+1);
                    694: 
                    695:        if (errno==ENOEXEC)
                    696:        {
                    697:                av[1] = f;
                    698:                execv(shellname, av);
                    699:                fatal("No shell!");
                    700:        }
                    701:        if (errno==ENOMEM)
                    702:                fatalstr("%s: too large", f);
                    703: }
                    704: 
                    705: 
                    706: 
                    707: 
                    708: 
                    709: 
                    710: done(k)
                    711: int k;
                    712: {
                    713:        static int recurs       = NO;
                    714: 
                    715:        if(recurs == NO)
                    716:        {
                    717:                recurs = YES;
                    718:                rmfiles();
                    719:        }
                    720:        exit(k);
                    721: }
                    722: 
                    723: 
                    724: 
                    725: 
                    726: 
                    727: 
                    728: enbint(k)
                    729: void (*k)();
                    730: {
                    731:        if(sigivalue == 0)
                    732:                signal(SIGINT,k);
                    733:        if(sigqvalue == 0)
                    734:                signal(SIGQUIT,k);
                    735:        if(sighvalue == 0)
                    736:                signal(SIGHUP,k);
                    737:        if(sigtvalue == 0)
                    738:                signal(SIGTERM,k);
                    739: }
                    740: 
                    741: 
                    742: 
                    743: 
                    744: intrupt()
                    745: {
                    746:        done(2);
                    747: }
                    748: 
                    749: 
                    750: 
                    751: await(waitpid)
                    752: int waitpid;
                    753: {
                    754:        int w, status;
                    755: 
                    756:        enbint(SIG_IGN);
                    757:        while ( (w = wait(&status)) != waitpid)
                    758:                if(w == -1)
                    759:                        fatal("bad wait code");
                    760:        enbint(intrupt);
                    761:        if(status & 0377)
                    762:        {
                    763:                if(status != SIGINT)
                    764:                        fprintf(diagfile, "Termination code %d", status);
                    765:                done(3);
                    766:        }
                    767:        return(status>>8);
                    768: }
                    769: 
                    770: /* File Name and File Manipulation Routines */
                    771: 
                    772: unreadable(s)
                    773: register char *s;
                    774: {
                    775:        register FILE *fp;
                    776: 
                    777:        if(fp = fopen(s, "r"))
                    778:        {
                    779:                fclose(fp);
                    780:                return(NO);
                    781:        }
                    782: 
                    783:        else
                    784:        {
                    785:                fprintf(diagfile, "Error: Cannot read file %s\n", s);
                    786:                return(YES);
                    787:        }
                    788: }
                    789: 
                    790: 
                    791: 
                    792: clf(p)
                    793: FILEP *p;
                    794: {
                    795:        if(p!=NULL && *p!=NULL && *p!=stdout)
                    796:        {
                    797:                if(ferror(*p))
                    798:                        fatal("writing error");
                    799:                fclose(*p);
                    800:        }
                    801:        *p = NULL;
                    802: }
                    803: 
                    804: rmfiles()
                    805: {
                    806:        rmf(textfname);
                    807:        rmf(asmfname);
                    808:        rmf(initfname);
                    809:        rmf(asmpass2);
                    810: #if TARGET == INTERDATA
                    811:        rmf(setfname);
                    812: #endif
                    813: }
                    814: 
                    815: 
                    816: 
                    817: 
                    818: 
                    819: 
                    820: 
                    821: 
                    822: /* return -1 if file does not exist, 0 if it is of zero length
                    823:    and 1 if of positive length
                    824: */
                    825: content(filename)
                    826: char *filename;
                    827: {
                    828: #ifdef VERSION6
                    829:        struct stat
                    830:        {
                    831:                char cjunk[9];
                    832:                char size0;
                    833:                int size1;
                    834:                int ijunk[12];
                    835:        } buf;
                    836: #else
                    837: #      include <sys/types.h>
                    838: #      include <sys/stat.h>
                    839:        struct stat buf;
                    840: #endif
                    841: 
                    842:        if(stat(filename,&buf) < 0)
                    843:                return(-1);
                    844: #ifdef VERSION6
                    845:        return(buf.size0 || buf.size1);
                    846: #else
                    847:        return( buf.st_size > 0 );
                    848: #endif
                    849: }
                    850: 
                    851: 
                    852: 
                    853: 
                    854: crfnames()
                    855: {
                    856:        fname(textfname, "x");
                    857:        fname(asmfname, "s");
                    858:        fname(asmpass2, "a");
                    859:        fname(initfname, "d");
                    860:        fname(sortfname, "S");
                    861:        fname(objfdefault, "o");
                    862:        fname(prepfname, "p");
                    863:        fname(optzfname, "z");
                    864:        fname(setfname, "A");
                    865: }
                    866: 
                    867: 
                    868: 
                    869: 
                    870: rmf(fn)
                    871: register char *fn;
                    872: {
                    873:        if(!debugflag && fn!=NULL && *fn!='\0')
                    874:                unlink(fn);
                    875: }
                    876: 
                    877: 
                    878: 
                    879: 
                    880: 
                    881: LOCAL fname(name, suff)
                    882: char *name, *suff;
                    883: {
                    884:        sprintf(name, "/tmp/%s%d.%s", temppref, pid, suff);
                    885: }
                    886: 
                    887: 
                    888: 
                    889: 
                    890: dotchar(s)
                    891: register char *s;
                    892: {
                    893:        for( ; *s ; ++s)
                    894:                if(s[0]=='.' && s[1]!='\0' && s[2]=='\0')
                    895:                        return( s[1] );
                    896:        return(NO);
                    897: }
                    898: 
                    899: 
                    900: 
                    901: char *lastfield(s)
                    902: register char *s;
                    903: {
                    904:        register char *t;
                    905:        for(t = s; *s ; ++s)
                    906:                if(*s == '/')
                    907:                        t = s+1;
                    908:        return(t);
                    909: }
                    910: 
                    911: 
                    912: 
                    913: char *lastchar(s)
                    914: register char *s;
                    915: {
                    916:        while(*s)
                    917:                ++s;
                    918:        return(s-1);
                    919: }
                    920: 
                    921: char *setdoto(s)
                    922: register char *s;
                    923: {
                    924:        *lastchar(s) = 'o';
                    925:        return( lastfield(s) );
                    926: }
                    927: 
                    928: 
                    929: 
                    930: badfile(s)
                    931: char *s;
                    932: {
                    933:        fatalstr("cannot open intermediate file %s", s);
                    934: }
                    935: 
                    936: 
                    937: 
                    938: ptr ckalloc(n)
                    939: int n;
                    940: {
                    941:        ptr p, calloc();
                    942: 
                    943:        if( p = calloc(1, (unsigned) n) )
                    944:                return(p);
                    945: 
                    946:        fatal("out of memory");
                    947:        /* NOTREACHED */
                    948: }
                    949: 
                    950: 
                    951: 
                    952: 
                    953: 
                    954: char *copyn(n, s)
                    955: register int n;
                    956: register char *s;
                    957: {
                    958:        register char *p, *q;
                    959: 
                    960:        p = q = (char *) ckalloc(n);
                    961:        while(n-- > 0)
                    962:                *q++ = *s++;
                    963:        return(p);
                    964: }
                    965: 
                    966: 
                    967: 
                    968: char *copys(s)
                    969: char *s;
                    970: {
                    971:        return( copyn( strlen(s)+1 , s) );
                    972: }
                    973: 
                    974: 
                    975: 
                    976: 
                    977: 
                    978: oneof(c,s)
                    979: register c;
                    980: register char *s;
                    981: {
                    982:        while( *s )
                    983:                if(*s++ == c)
                    984:                        return(YES);
                    985:        return(NO);
                    986: }
                    987: 
                    988: 
                    989: 
                    990: nodup(s)
                    991: char *s;
                    992: {
                    993:        register char **p;
                    994: 
                    995:        for(p = loadargs ; p < loadp ; ++p)
                    996:                if( !strcmp(*p, s) )
                    997:                        return(NO);
                    998: 
                    999:        return(YES);
                   1000: }
                   1001: 
                   1002: 
                   1003: 
                   1004: static fatal(t)
                   1005: char *t;
                   1006: {
                   1007:        fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t);
                   1008:        if(debugflag)
                   1009:                abort();
                   1010:        done(1);
                   1011:        exit(1);
                   1012: }
                   1013: 
                   1014: 
                   1015: 
                   1016: 
                   1017: static fatali(t,d)
                   1018: char *t;
                   1019: int d;
                   1020: {
                   1021:        char buff[100];
                   1022:        sprintf(buff, t, d);
                   1023:        fatal(buff);
                   1024: }
                   1025: 
                   1026: 
                   1027: 
                   1028: 
                   1029: static fatalstr(t, s)
                   1030: char *t, *s;
                   1031: {
                   1032:        char buff[100];
                   1033:        sprintf(buff, t, s);
                   1034:        fatal(buff);
                   1035: }
                   1036: err(s)
                   1037: char *s;
                   1038: {
                   1039:        fprintf(diagfile, "Error in file %s: %s\n", infname, s);
                   1040: }
                   1041: 
                   1042: /* Code to generate initializations for DATA statements */
                   1043: 
                   1044: LOCAL int nch  = 0;
                   1045: LOCAL FILEP asmfile;
                   1046: LOCAL FILEP sortfile;
                   1047: 
                   1048: #include "ftypes"
                   1049: 
                   1050: static ftnint typesize[NTYPES]
                   1051: = { 
                   1052:        1, SZADDR, SZSHORT, SZLONG, SZLONG, 2*SZLONG,
                   1053:        2*SZLONG, 4*SZLONG, SZLONG, 1, 1, 1};
                   1054: static int typealign[NTYPES]
                   1055: = { 
                   1056:        1, ALIADDR, ALISHORT, ALILONG, ALILONG, ALIDOUBLE,
                   1057:        ALILONG, ALIDOUBLE, ALILONG, 1, 1, 1};
                   1058: 
                   1059: dodata()
                   1060: {
                   1061:        char buff[50];
                   1062:        char varname[XL+1], ovarname[XL+1];
                   1063:        int status;
                   1064:        flag erred;
                   1065:        ftnint offset, vlen, type;
                   1066:        register ftnint ooffset, ovlen;
                   1067:        ftnint nblank, vchar;
                   1068:        int size, align;
                   1069:        int vargroup;
                   1070:        ftnint totlen, doeven();
                   1071: 
                   1072:        erred = NO;
                   1073:        ovarname[0] = '\0';
                   1074:        ooffset = 0;
                   1075:        ovlen = 0;
                   1076:        totlen = 0;
                   1077:        nch = 0;
                   1078: 
                   1079:        sprintf(buff, "sort %s >%s", initfname, sortfname);
                   1080:        if(status = sys(buff))
                   1081:                fatali("call sort status = %d", status);
                   1082:        if( (sortfile = fopen(sortfname, "r")) == NULL)
                   1083:                badfile(sortfname);
                   1084:        if( (asmfile = fopen(asmfname, "a")) == NULL)
                   1085:                badfile(asmfname);
                   1086:        pruse(asmfile, USEINIT);
                   1087: 
                   1088:        while( rdname(&vargroup, varname) && rdlong(&offset) && rdlong(&vlen) && rdlong(&type) )
                   1089:        {
                   1090:                size = typesize[type];
                   1091:                if( strcmp(varname, ovarname) )
                   1092:                {
                   1093:                        prspace(ovlen-ooffset);
                   1094:                        strcpy(ovarname, varname);
                   1095:                        ooffset = 0;
                   1096:                        totlen += ovlen;
                   1097:                        ovlen = vlen;
                   1098:                        if(vargroup == 0)
                   1099:                                align = (type==TYCHAR || type==TYBLANK ?
                   1100:                                    SZLONG : typealign[type]);
                   1101:                        else    align = ALIDOUBLE;
                   1102:                        totlen = doeven(totlen, align);
                   1103:                        if(vargroup == 2)
                   1104:                                prcomblock(asmfile, varname);
                   1105:                        else
                   1106:                                fprintf(asmfile, LABELFMT, varname);
                   1107:                }
                   1108:                if(offset < ooffset)
                   1109:                {
                   1110:                        erred = YES;
                   1111:                        err("overlapping initializations");
                   1112:                        ooffset = offset;
                   1113:                }
                   1114:                if(offset > ooffset)
                   1115:                {
                   1116:                        prspace(offset-ooffset);
                   1117:                        ooffset = offset;
                   1118:                }
                   1119:                if(type == TYCHAR)
                   1120:                {
                   1121:                        if( rdlong(&vchar) )
                   1122:                                prch( (int) vchar );
                   1123:                        else
                   1124:                                fatal("bad intermediate file format");
                   1125:                }
                   1126:                else if(type == TYBLANK)
                   1127:                {
                   1128:                        if( rdlong(&nblank) )
                   1129:                        {
                   1130:                                size = nblank;
                   1131:                                while( --nblank >= 0)
                   1132:                                        prch( ' ' );
                   1133:                        }
                   1134:                        else
                   1135:                                fatal("bad intermediate file format");
                   1136:                }
                   1137:                else
                   1138:                {
                   1139:                        putc('\t', asmfile);
                   1140:                        while   ( putc( getc(sortfile), asmfile)  != '\n')
                   1141:                                ;
                   1142:                }
                   1143:                if( (ooffset += size) > ovlen)
                   1144:                {
                   1145:                        erred = YES;
                   1146:                        err("initialization out of bounds");
                   1147:                }
                   1148:        }
                   1149: 
                   1150:        prspace(ovlen-ooffset);
                   1151:        totlen = doeven(totlen+ovlen, (ALIDOUBLE>SZLONG ? ALIDOUBLE : SZLONG) );
                   1152:        clf(&sortfile);
                   1153:        clf(&asmfile);
                   1154:        clf(&sortfile);
                   1155:        rmf(sortfname);
                   1156:        return(erred);
                   1157: }
                   1158: 
                   1159: 
                   1160: 
                   1161: 
                   1162: prspace(n)
                   1163: register ftnint n;
                   1164: {
                   1165:        register ftnint m;
                   1166: 
                   1167:        while(nch>0 && n>0)
                   1168:        {
                   1169:                --n;
                   1170:                prch(0);
                   1171:        }
                   1172:        m = SZSHORT * (n/SZSHORT);
                   1173:        if(m > 0)
                   1174:                prskip(asmfile, m);
                   1175:        for(n -= m ; n>0 ; --n)
                   1176:                prch(0);
                   1177: }
                   1178: 
                   1179: 
                   1180: 
                   1181: 
                   1182: ftnint doeven(tot, align)
                   1183: register ftnint tot;
                   1184: int align;
                   1185: {
                   1186:        ftnint new;
                   1187:        new = roundup(tot, align);
                   1188:        prspace(new - tot);
                   1189:        return(new);
                   1190: }
                   1191: 
                   1192: 
                   1193: 
                   1194: rdname(vargroupp, name)
                   1195: int *vargroupp;
                   1196: register char *name;
                   1197: {
                   1198:        register int i, c;
                   1199: 
                   1200:        if( (c = getc(sortfile)) == EOF)
                   1201:                return(NO);
                   1202:        *vargroupp = c - '0';
                   1203: 
                   1204:        for(i = 0 ; i<XL ; ++i)
                   1205:        {
                   1206:                if( (c = getc(sortfile)) == EOF)
                   1207:                        return(NO);
                   1208:                if(c != ' ')
                   1209:                        *name++ = c;
                   1210:        }
                   1211:        *name = '\0';
                   1212:        return(YES);
                   1213: }
                   1214: 
                   1215: 
                   1216: 
                   1217: rdlong(n)
                   1218: register ftnint *n;
                   1219: {
                   1220:        register int c;
                   1221: 
                   1222:        for(c = getc(sortfile) ; c!=EOF && isspace(c) ; c = getc(sortfile) );
                   1223:        ;
                   1224:        if(c == EOF)
                   1225:                return(NO);
                   1226: 
                   1227:        for(*n = 0 ; isdigit(c) ; c = getc(sortfile) )
                   1228:                *n = 10* (*n) + c - '0';
                   1229:        return(YES);
                   1230: }
                   1231: 
                   1232: 
                   1233: 
                   1234: 
                   1235: prch(c)
                   1236: register int c;
                   1237: {
                   1238:        static int buff[SZSHORT];
                   1239: 
                   1240:        buff[nch++] = c;
                   1241:        if(nch == SZSHORT)
                   1242:        {
                   1243:                prchars(asmfile, buff);
                   1244:                nch = 0;
                   1245:        }
                   1246: }

unix.superglobalmegacorp.com

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