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

Defined functions

bgnproc defined in line 413; never used
cant defined in line 656; used 3 times
dofile defined in line 334; used 2 times
done defined in line 571; used 4 times
endproc defined in line 441; used 1 times
eqlstrng defined in line 583; used 2 times
gccomp defined in line 630; used 1 times
gcoutf defined in line 605; used 1 times
implinit defined in line 499; used 2 times
init defined in line 507; used 1 times
intrupt defined in line 564; used 2 times
main defined in line 153; never used
meter defined in line 543; never used

Defined variables

afterif defined in line 138; used 1 times
ateof defined in line 59; used 2 times
basefile defined in line 53; used 2 times
blklevel defined in line 86; used 6 times
comneed defined in line 67; used 1 times
compile defined in line 149; used 7 times
constno defined in line 30; used 1 times
ctllevel defined in line 87; used 1 times
dbgflag defined in line 35; used 2 times
dbglevel defined in line 132; never used
dbgopt defined in line 131; never used
dclsect defined in line 88; used 2 times
defneed defined in line 65; used 1 times
dotsopt defined in line 130; never used
dumpcore defined in line 39; used 1 times
dumpic defined in line 33; used 2 times
eflftn defined in line 113; used 8 times
efmacp defined in line 56; never used
eofneed defined in line 63; used 1 times
fcb defined in line 42; used 4 times
fieldmax defined in line 127; never used
filedepth defined in line 55; used 2 times
filelines defined in line 54; used 1 times
filemacs defined in line 57; never used
filenames defined in line 52; used 3 times
forcerr defined in line 64; used 1 times
ftnames defined in line 102; never used
ftnefl defined in line 111; never used
ftnmask defined in line 114; never used
graal defined in line 94; used 2 times
ibfile defined in line 44; never used
icfile defined in line 45; used 2 times
idfile defined in line 46; never used
iefile defined in line 47; never used
igeol defined in line 61; never used
iifilep defined in line 43; never used
impltype defined in line 109; never used
inbound defined in line 90; never used
indifs defined in line 136; never used
inproc defined in line 91; used 3 times
instruct defined in line 89; never used
iobrlevel defined in line 70; used 1 times
labno defined in line 31; used 1 times
langopt defined in line 129; never used
lettneed defined in line 69; used 1 times
memdump defined in line 34; used 2 times
msg defined in line 40; used 2 times
nbad defined in line 26; used 3 times
ncases defined in line 92; never used
ndecl defined in line 100; used 1 times
neflnames defined in line 105; used 2 times
nerrs defined in line 25; used 4 times
nftnames defined in line 107; used 3 times
nftnch defined in line 134; never used
nftncont defined in line 135; never used
nftnm0 defined in line 108; used 3 times
nhid defined in line 99; used 1 times
nocommentflag defined in line 37; used 2 times
nowarnflag defined in line 36; used 1 times
nwarns defined in line 27; used 4 times
nxtindif defined in line 137; used 1 times
nxtstno defined in line 29; used 1 times
optneed defined in line 68; used 1 times
prevbg defined in line 66; used 1 times
procclass defined in line 96; used 2 times
pushchars defined in line 58; never used
pushlex defined in line 62; never used
stnos defined in line 28; never used
sysflag defined in line 23; used 3 times
systab defined in line 116; used 1 times
tailor defined in line 115; used 1 times
verbose defined in line 38; used 3 times
xxxvers defined in line 1; never used

Defined macros

BCD defined in line 147; used 1 times
BIT defined in line 141; used 7 times
EXEC defined in line 144; used 1 times
FDS defined in line 143; used 1 times
FORM defined in line 145; used 2 times
FORTRAN defined in line 142; used 1 times
LNO defined in line 146; used 1 times
OPTZ defined in line 148; used 1 times
Last modified: 1982-06-09
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2625
Valid CSS Valid XHTML 1.0 Strict