Annotation of 42BSD/usr.bin/efl/main.c, revision 1.1.1.1

1.1       root        1: static char xxxvers[ ] = "\n@(#)EFL VERSION 1.14,  19 AUGUST 1980";
                      2: 
                      3: /* Compiler for the EFL Programming Language.  Written by:
                      4:                Stuart I. Feldman
                      5:                Bell Laboratories
                      6:                Murray Hill, New Jersey
                      7: */
                      8: 
                      9: 
                     10: /* Flags:
                     11:        -d      EFL debugging output
                     12:        -v      verbose (print out Pass numbers and memory limits)
                     13:        -w      supress warning messages
                     14:        -f      put Fortran output on appropriate .f files
                     15:        -F      put Fortran code for input file x onto x.F
                     16:        -e      divert diagnostic output to next argument
                     17:        -#      do not pass comments through to output
                     18: */
                     19: 
                     20: 
                     21: #include "defs"
                     22: 
                     23: int sysflag;
                     24: 
                     25: int nerrs      = 0;
                     26: int nbad       = 0;
                     27: int nwarns     = 0;
                     28: int stnos[MAXSTNO];
                     29: int nxtstno    = 0;
                     30: int constno    = 0;
                     31: int labno      = 0;
                     32: 
                     33: int dumpic     = NO;
                     34: int memdump    = NO;
                     35: int dbgflag    = NO;
                     36: int nowarnflag = NO;
                     37: int nocommentflag      = NO;
                     38: int verbose    = NO;
                     39: int dumpcore   = NO;
                     40: char msg[200];
                     41: 
                     42: struct fileblock fcb[4];
                     43: struct fileblock *iifilep;
                     44: struct fileblock *ibfile       = &fcb[0];
                     45: struct fileblock *icfile       = &fcb[1];
                     46: struct fileblock *idfile       = &fcb[2];
                     47: struct fileblock *iefile       = &fcb[3];
                     48: 
                     49: FILE *diagfile = {stderr};
                     50: FILE *codefile = {stdout};
                     51: FILE *fileptrs[MAXINCLUDEDEPTH];
                     52: char *filenames[MAXINCLUDEDEPTH];
                     53: char *basefile;
                     54: int filelines[MAXINCLUDEDEPTH];
                     55: int filedepth  = 0;
                     56: char *efmacp   = NULL;
                     57: char *filemacs[MAXINCLUDEDEPTH];
                     58: int pushchars[MAXINCLUDEDEPTH];
                     59: int ateof      = NO;
                     60: 
                     61: int igeol      = NO;
                     62: int pushlex    = NO;
                     63: int eofneed    = NO;
                     64: int forcerr     = NO;
                     65: int defneed     = NO;
                     66: int prevbg      = NO;
                     67: int comneed     = NO;
                     68: int optneed     = NO;
                     69: int lettneed   = NO;
                     70: int iobrlevel  = 0;
                     71: 
                     72: ptr comments   = NULL;
                     73: ptr prevcomments       = NULL;
                     74: ptr genequivs  = NULL;
                     75: ptr arrays     = NULL;
                     76: ptr generlist  = NULL;
                     77: ptr knownlist  = NULL;
                     78: 
                     79: ptr thisexec;
                     80: ptr thisctl;
                     81: chainp tempvarlist     = CHNULL;
                     82: chainp temptypelist    = CHNULL;
                     83: chainp hidlist = CHNULL;
                     84: chainp commonlist      = CHNULL;
                     85: chainp gonelist        = CHNULL;
                     86: int blklevel   = 0;
                     87: int ctllevel   = 0;
                     88: int dclsect    = 0;
                     89: int instruct   = 0;
                     90: int inbound    = 0;
                     91: int inproc     = 0;
                     92: int ncases     = 0;
                     93: 
                     94: int graal      = 0;
                     95: ptr procname   = NULL;
                     96: int procclass  = 0;
                     97: ptr thisargs   = NULL;
                     98: 
                     99: int nhid[MAXBLOCKDEPTH];
                    100: int ndecl[MAXBLOCKDEPTH];
                    101: 
                    102: char ftnames[MAXFTNAMES][7];
                    103: 
                    104: 
                    105: int neflnames  = 0;
                    106: 
                    107: int nftnames;
                    108: int nftnm0;
                    109: int impltype[26];
                    110: 
                    111: int ftnefl[NFTNTYPES]  = { TYINT, TYREAL, TYLOG, TYCOMPLEX, TYLREAL,
                    112:                                TYCHAR, TYLCOMPLEX };
                    113: int eflftn[NEFLTYPES];
                    114: int ftnmask[NFTNTYPES]         = { 1, 2, 4, 8, 16, 32, 64 };
                    115: struct tailoring tailor;
                    116: struct system systab[] =
                    117:        {
                    118:                { "portable", 0,        1, 10, 7, 15},
                    119:                { "unix", UNIX, 4, 10, 7, 15 },
                    120:                { "gcos", GCOS, 4, 10, 7, 15 },
                    121:                { "gcosbcd", GCOSBCD,   6, 10, 7, 15},
                    122:                { "cray", CRAY, 8, 10, 7, 15},
                    123:                { "ibm", IBM,   4, 10, 7, 15 },
                    124:                { NULL }
                    125:        };
                    126: 
                    127: double fieldmax        = FIELDMAX;
                    128: 
                    129: int langopt    = 2;
                    130: int dotsopt    = 0;
                    131: int dbgopt     = 0;
                    132: int dbglevel   = 0;
                    133: 
                    134: int nftnch;
                    135: int nftncont;
                    136: int indifs[MAXINDIFS];
                    137: int nxtindif;
                    138: int afterif    = 0;
                    139: 
                    140: #ifdef gcos
                    141: #      define BIT(n)   (1 << (36 - 1 - n) )
                    142: #      define FORTRAN  BIT(1)
                    143: #      define FDS      BIT(4)
                    144: #      define EXEC     BIT(5)
                    145: #      define FORM     BIT(14)
                    146: #      define LNO      BIT(15)
                    147: #      define BCD      BIT(16)
                    148: #      define OPTZ     BIT(17)
                    149:        int     compile = FORTRAN | FDS;
                    150: #endif
                    151: 
                    152: 
                    153: main(argc,argv)
                    154: register int argc;
                    155: register char **argv;
                    156: {
                    157: FILE *fd;
                    158: register char *p;
                    159: int neflnm0;
                    160: 
                    161: #ifdef unix
                    162:        int intrupt();
                    163:        sysflag = UNIX;
                    164: 
                    165: /*
                    166:        meter();
                    167: */
                    168:        if( (signal(2,1) & 01) == 0)
                    169:                signal(2, intrupt);
                    170: #endif
                    171: 
                    172: #ifdef gcos
                    173: /*
                    174:        meter();
                    175: */
                    176:        sysflag = (intss() ? GCOS : GCOSBCD);
                    177: #endif
                    178: 
                    179: 
                    180: crii();
                    181: --argc;
                    182: ++argv;
                    183: tailinit(systab + sysflag);
                    184: 
                    185: while(argc>0 && ( (argv[0][0]=='-' && argv[0][1]!='\0') || eqlstrng(argv[0]) ))
                    186:        {
                    187:        if(argv[0][0] == '-')
                    188:            for(p = argv[0]+1 ; *p ; ++p) switch(*p)
                    189:                {
                    190:                case ' ':
                    191:                        break;
                    192: 
                    193:                case 'd':
                    194:                case 'D':
                    195:                        switch( *++p)
                    196:                                {
                    197:                                case '1':
                    198:                                        dbgflag = YES;
                    199:                                        break;
                    200:                                case '2':
                    201:                                        setyydeb();
                    202:                                        break;
                    203:                                case '3':
                    204:                                        dumpcore = YES;
                    205:                                        break;
                    206:                                case '4':
                    207:                                        dumpic = YES;
                    208:                                        break;
                    209:                                case 'm':
                    210:                                case 'M':
                    211:                                        memdump = YES;
                    212:                                        break;
                    213: 
                    214:                                default:
                    215:                                        dbgflag = YES;
                    216:                                        --p;
                    217:                                        break;
                    218:                                }
                    219:                        break;
                    220: 
                    221:                case 'w':
                    222:                case 'W':
                    223:                        nowarnflag = YES;
                    224:                        break;
                    225: 
                    226:                case 'v':
                    227:                case 'V':
                    228:                        verbose = YES;
                    229:                        break;
                    230: 
                    231:                case '#':
                    232:                        nocommentflag = YES;
                    233:                        break;
                    234: 
                    235:                case 'C':
                    236:                case 'c':
                    237:                        nocommentflag = NO;
                    238:                        break;
                    239: 
                    240: #ifdef gcos
                    241:                case 'O':
                    242:                case 'o':
                    243:                        compile |= OPTZ;
                    244:                        break;
                    245: 
                    246:                case 'E':
                    247:                case 'e':
                    248:                        compile = 0;
                    249:                        break;
                    250: #endif
                    251: 
                    252:                default:
                    253:                        fprintf(diagfile, "Illegal EFL flag %c\n", *p);
                    254:                        exit(1);
                    255:                }
                    256:        --argc;
                    257:        ++argv;
                    258:        }
                    259: 
                    260: kwinit();
                    261: geninit();
                    262: knowninit();
                    263: init();
                    264: implinit();
                    265: neflnm0 = neflnames;
                    266: 
                    267: #ifdef gcos
                    268:        if( intss() )
                    269:                compile = 0;
                    270:        else
                    271:                gcoutf();
                    272: #endif
                    273: 
                    274: /*     fprintf(diagfile, "EFL 1.10\n");        */
                    275: 
                    276: if(argc==0)
                    277:        {
                    278:        filenames[0] = "-";
                    279:        dofile(stdin);
                    280:        }
                    281: else
                    282:        while(argc>0)
                    283:                {
                    284:                if( eqlstrng(argv[0]) )
                    285:                        {
                    286:                        --argc;
                    287:                        ++argv;
                    288:                        continue;
                    289:                        }
                    290:                if(argv[0][0]=='-' && argv[0][1]=='\0')
                    291:                        {
                    292:                        basefile = "";
                    293:                        fd = stdin;
                    294:                        }
                    295:                else    {
                    296:                        basefile = argv[0];
                    297:                        fd = fopen(argv[0], "r");
                    298:                        }
                    299:                if(fd == NULL)
                    300:                        {
                    301:                        sprintf(msg, "Cannot open file %s", argv[0]);
                    302:                        fprintf(diagfile, "%s.  Stop\n", msg);
                    303:                        done(2);
                    304:                        }
                    305:                filenames[0] = argv[0];
                    306:                filedepth = 0;
                    307: 
                    308:                nftnames = 0;
                    309:                nftnm0 = 0;
                    310:                neflnames = neflnm0;
                    311: 
                    312:                dofile(fd);
                    313:                if(fd != stdin)
                    314:                        fclose(fd);
                    315:                --argc;
                    316:                ++argv;
                    317:                }
                    318: p2flush();
                    319: if(verbose)
                    320:        fprintf(diagfile, "End of compilation\n");
                    321: /*
                    322: prhisto();
                    323: /* */
                    324: rmiis();
                    325: 
                    326: #ifdef gcos
                    327:        gccomp();
                    328: #endif
                    329: 
                    330: done(nbad);
                    331: }
                    332: 
                    333: 
                    334: dofile(fd)
                    335: FILE *fd;
                    336: {
                    337: int k;
                    338: 
                    339: fprintf(diagfile, "File %s:\n", filenames[0]);
                    340: 
                    341: #ifdef gcos
                    342:        if( fd==stdin && intss() && inquire(stdin, _TTY) )
                    343:                freopen("*src", "rt", stdin);
                    344: #endif
                    345: 
                    346: yyin = fileptrs[0] = fd;
                    347: yylineno = filelines[0] = 1;
                    348: filedepth = 0;
                    349: ateof = 0;
                    350: 
                    351: do     {
                    352:        nerrs = 0;
                    353:        nwarns = 0;
                    354:        eofneed = 0;
                    355:        forcerr = 0;
                    356:        comneed = 0;
                    357:        optneed = 0;
                    358:        defneed = 0;
                    359:        lettneed = 0;
                    360:        iobrlevel = 0;
                    361:        prevbg = 0;
                    362: 
                    363:        constno = 0;
                    364:        labno = 0;
                    365:        nxtstno = 0;
                    366:        afterif = 0;
                    367:        thisexec = 0;
                    368:        thisctl = 0;
                    369:        nxtindif = 0;
                    370:        inproc = 0;
                    371:        blklevel = 0;
                    372: 
                    373:        implinit();
                    374: 
                    375:        opiis();
                    376:        swii(icfile);
                    377: 
                    378:        if(k = yyparse())
                    379:                fprintf(diagfile, "Error in source file.\n");
                    380:        else  switch(graal)
                    381:                {
                    382:                case PARSERR:
                    383:                        /*
                    384:                        fprintf(diagfile, "error\n");
                    385:                        */
                    386:                        break;
                    387: 
                    388:                case PARSEOF:
                    389:                        break;
                    390: 
                    391:                case PARSOPT:
                    392:                        propts();
                    393:                        break;
                    394: 
                    395:                case PARSDCL:
                    396:                        fprintf(diagfile, "external declaration\n");
                    397:                        break;
                    398: 
                    399:                case PARSPROC:
                    400:                        /* work already done in endproc */
                    401:                        break;
                    402: 
                    403:                case PARSDEF:
                    404:                        break;
                    405:                }
                    406: 
                    407:        cliis();
                    408:        if(nerrs) ++nbad;
                    409: 
                    410:        } while(graal!=PARSEOF && !ateof);
                    411: }
                    412: 
                    413: ptr bgnproc()
                    414: {
                    415: ptr bgnexec();
                    416: 
                    417: if(blklevel > 0)
                    418:        {
                    419:        execerr("procedure %s terminated prematurely", procnm() );
                    420:        endproc();
                    421:        }
                    422: ctllevel = 0;
                    423: procname = 0;
                    424: procclass = 0;
                    425: thisargs = 0;
                    426: dclsect = 0;
                    427: blklevel = 1;
                    428: nftnm0 = nftnames;
                    429: dclsect = 1;
                    430: ndecl[1] = 0;
                    431: nhid[1] = 0;
                    432: 
                    433: thisctl = allexcblock();
                    434: thisctl->tag = TCONTROL;
                    435: thisctl->subtype = STPROC;
                    436: inproc = 1;
                    437: return( bgnexec() );
                    438: }
                    439: 
                    440: 
                    441: endproc()
                    442: {
                    443: char comline[50], *concat();
                    444: ptr p;
                    445: 
                    446: inproc = 0;
                    447: 
                    448: if(nerrs == 0)
                    449:        {
                    450:        pass2();
                    451:        unhide();
                    452:        cleanst();
                    453:        if(dumpic)
                    454:                system( concat("od ", icfile->filename, comline) );
                    455:        if(memdump)
                    456:                prmem();
                    457:        }
                    458: else   {
                    459:        fprintf(diagfile, "**Procedure %s not generated\n", procnm());
                    460:        for( ; blklevel > 0 ; --blklevel)
                    461:                unhide();
                    462:        cleanst();
                    463:        }
                    464: 
                    465: if(nerrs==0 && nwarns>0)
                    466:        if(nwarns == 1)
                    467:                fprintf(diagfile,"*1 warning\n");
                    468:        else    fprintf(diagfile, "*%d warnings\n", nwarns);
                    469: 
                    470: blklevel = 0;
                    471: thisargs = 0;
                    472: procname = 0;
                    473: procclass = 0;
                    474: while(thisctl)
                    475:        {
                    476:        p = thisctl;
                    477:        thisctl = thisctl->prevctl;
                    478:        frexcblock(p);
                    479:        }
                    480: 
                    481: while(thisexec)
                    482:        {
                    483:        p = thisexec;
                    484:        thisexec = thisexec->prevexec;
                    485:        frexcblock(p);
                    486:        }
                    487: 
                    488: nftnames = nftnm0;
                    489: if(verbose)
                    490:        {
                    491:        fprintf(diagfile, "Highwater mark %d words. ", nmemused);
                    492:        fprintf(diagfile, "%ld words left over\n", totalloc-totfreed);
                    493:        }
                    494: }
                    495: 
                    496: 
                    497: 
                    498: 
                    499: implinit()
                    500: {
                    501: setimpl(TYREAL, 'a', 'z');
                    502: setimpl(TYINT,  'i', 'n');
                    503: }
                    504: 
                    505: 
                    506: 
                    507: init()
                    508: {
                    509: eflftn[TYINT] = FTNINT;
                    510: eflftn[TYREAL] = FTNREAL;
                    511: eflftn[TYLREAL] = FTNDOUBLE;
                    512: eflftn[TYLOG] = FTNLOG;
                    513: eflftn[TYCOMPLEX] = FTNCOMPLEX;
                    514: eflftn[TYCHAR] = FTNINT;
                    515: eflftn[TYFIELD] = FTNINT;
                    516: eflftn[TYLCOMPLEX] = FTNDOUBLE;
                    517: }
                    518: 
                    519: 
                    520: 
                    521: 
                    522: #ifdef gcos
                    523: meter()
                    524: {
                    525: FILE *mout;
                    526: char *cuserid(), *datime(), *s;
                    527: if(equals(s = cuserid(), "efl")) return;
                    528: mout = fopen("efl/eflmeter", "a");
                    529: if(mout == NULL)
                    530:        fprintf(diagfile,"cannot open meter file");
                    531: 
                    532: else   {
                    533:        fprintf(mout, "%s user %s at %s\n",
                    534:                ( rutss()? "tss  " : "batch"), s, datime() );
                    535:        fclose(mout);
                    536:        }
                    537: }
                    538: #endif
                    539: 
                    540: 
                    541: 
                    542: #ifdef unix
                    543: meter()        /* temporary metering of non-SIF usage */
                    544: {
                    545: FILE *mout;
                    546: int tvec[2];
                    547: int uid;
                    548: char *ctime(), *p;
                    549: 
                    550: uid = getuid() & 0377;
                    551: if(uid == 91) return;  /* ignore sif uses */
                    552: mout = fopen("/usr/sif/efl/Meter", "a");
                    553: if(mout == NULL)
                    554:        fprintf(diagfile, "cannot open meter file");
                    555: else   {
                    556:        time(tvec);
                    557:        p = ctime(tvec);
                    558:        p[16] = '\0';
                    559:        fprintf(mout,"User %d, %s\n",  uid, p+4);
                    560:        fclose(mout);
                    561:        }
                    562: }
                    563: 
                    564: intrupt()
                    565: {
                    566: done(0);
                    567: }
                    568: #endif
                    569: 
                    570: 
                    571: done(k)
                    572: int k;
                    573: {
                    574: rmiis();
                    575: exit(k);
                    576: }
                    577: 
                    578: 
                    579: 
                    580: 
                    581: 
                    582: /* if string has an embedded equal sign, set option with it*/
                    583: eqlstrng(s)
                    584: char *s;
                    585: {
                    586: register char *t;
                    587: 
                    588: for(t = s; *t; ++t)
                    589:        if(*t == '=')
                    590:                {
                    591:                *t = '\0';
                    592:                while( *++t == ' ' )
                    593:                        ;
                    594:                setopt(s, t);
                    595:                return(YES);
                    596:                }
                    597: 
                    598: return(NO);
                    599: }
                    600: 
                    601: #ifdef gcos
                    602: 
                    603: /* redirect output unit */
                    604: 
                    605: gcoutf()
                    606: {
                    607: if (!intss())
                    608:        {
                    609:        fputs("\t\t    Version 2.10 : read INFO/EFL (03/27/80)\n", stderr);
                    610:        if (compile)
                    611:                {
                    612:                static char name[80] = "s*", opts[20] = "yw";
                    613:                char *opt = (char *)inquire(stdout, _OPTIONS);
                    614:                if (!strchr(opt, 't'))
                    615:                        { /* if stdout is diverted */
                    616:                        sprintf(name, "%s\"s*\"",
                    617:                                (char *)inquire(stdout, _FILENAME));
                    618:                        strcpy(&opts[1], opt);
                    619:                        }
                    620:                if (freopen(name, opts, stdout) == NULL)
                    621:                        cant(name);
                    622:                }
                    623:        }
                    624: }
                    625: 
                    626: 
                    627: 
                    628: /* call in fortran compiler if necessary */
                    629: 
                    630: gccomp()
                    631: {
                    632: if (compile)
                    633:        {
                    634:        if (nbad > 0)   /* abort */
                    635:                cretsw(EXEC);
                    636: 
                    637:        else    { /* good: call forty */
                    638:                FILE *dstar; /* to intercept "gosys" action */
                    639: 
                    640:                if ((dstar = fopen("d*", "wv")) == NULL)
                    641:                        cant("d*");
                    642:                fputs("$\tforty\tascii", dstar);
                    643:                if (fopen("*1", "o") == NULL)
                    644:                        cant("*1");
                    645:                fclose(stdout, "rl");
                    646:                cretsw(FORM | LNO | BCD);
                    647:                if (! tailor.ftncontnu)
                    648:                        compile |= FORM;
                    649:                csetsw(compile);
                    650:                gosys("forty");
                    651:                }
                    652:        }
                    653: }
                    654: 
                    655: 
                    656: cant(s)
                    657: char *s;
                    658: {
                    659: ffiler(s);
                    660: done(1);
                    661: }
                    662: #endif

unix.superglobalmegacorp.com

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