|
|
1.1 root 1: static char xxxvers[ ] = "\n@(#)EFL VERSION 1.15, 19 DECEMBER 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: static char errbuf[BUFSIZ];
164:
165: setbuf(stderr, errbuf);
166:
167: sysflag = UNIX;
168:
169: /*
170: meter();
171: */
172: if( (signal(2,1) & 01) == 0)
173: signal(2, intrupt);
174: #endif
175:
176: #ifdef gcos
177: /*
178: meter();
179: */
180: sysflag = (intss() ? GCOS : GCOSBCD);
181: #endif
182:
183:
184: crii();
185: --argc;
186: ++argv;
187: tailinit(systab + sysflag);
188:
189: while(argc>0 && ( (argv[0][0]=='-' && argv[0][1]!='\0') || eqlstrng(argv[0]) ))
190: {
191: if(argv[0][0] == '-')
192: for(p = argv[0]+1 ; *p ; ++p) switch(*p)
193: {
194: case ' ':
195: break;
196:
197: case 'd':
198: case 'D':
199: switch( *++p)
200: {
201: case '1':
202: dbgflag = YES;
203: break;
204: case '2':
205: setyydeb();
206: break;
207: case '3':
208: dumpcore = YES;
209: break;
210: case '4':
211: dumpic = YES;
212: break;
213: case 'm':
214: case 'M':
215: memdump = YES;
216: break;
217:
218: default:
219: dbgflag = YES;
220: --p;
221: break;
222: }
223: break;
224:
225: case 'w':
226: case 'W':
227: nowarnflag = YES;
228: break;
229:
230: case 'v':
231: case 'V':
232: verbose = YES;
233: break;
234:
235: case '#':
236: nocommentflag = YES;
237: break;
238:
239: case 'C':
240: case 'c':
241: nocommentflag = NO;
242: break;
243:
244: #ifdef gcos
245: case 'O':
246: case 'o':
247: compile |= OPTZ;
248: break;
249:
250: case 'E':
251: case 'e':
252: compile = 0;
253: break;
254: #endif
255:
256: default:
257: fprintf(diagfile, "Illegal EFL flag %c\n", *p);
258: exit(1);
259: }
260: --argc;
261: ++argv;
262: }
263:
264: kwinit();
265: geninit();
266: knowninit();
267: init();
268: implinit();
269: neflnm0 = neflnames;
270:
271: #ifdef gcos
272: if( intss() )
273: compile = 0;
274: else
275: gcoutf();
276: #endif
277:
278: /* fprintf(diagfile, "EFL 1.10\n"); */
279:
280: if(argc==0)
281: {
282: filenames[0] = "-";
283: dofile(stdin);
284: }
285: else
286: while(argc>0)
287: {
288: if( eqlstrng(argv[0]) )
289: {
290: --argc;
291: ++argv;
292: continue;
293: }
294: if(argv[0][0]=='-' && argv[0][1]=='\0')
295: {
296: basefile = "";
297: fd = stdin;
298: }
299: else {
300: basefile = argv[0];
301: fd = fopen(argv[0], "r");
302: }
303: if(fd == NULL)
304: {
305: sprintf(msg, "Cannot open file %s", argv[0]);
306: fprintf(diagfile, "%s. Stop\n", msg);
307: done(2);
308: }
309: filenames[0] = argv[0];
310: filedepth = 0;
311:
312: nftnames = 0;
313: nftnm0 = 0;
314: neflnames = neflnm0;
315:
316: dofile(fd);
317: if(fd != stdin)
318: fclose(fd);
319: --argc;
320: ++argv;
321: }
322: p2flush();
323: if(verbose)
324: fprintf(diagfile, "End of compilation\n");
325: /*
326: prhisto();
327: /* */
328: rmiis();
329:
330: #ifdef gcos
331: gccomp();
332: #endif
333:
334: done(nbad);
335: }
336:
337:
338: dofile(fd)
339: FILE *fd;
340: {
341: int k;
342:
343: fprintf(diagfile, "File %s:\n", filenames[0]);
344:
345: #ifdef gcos
346: if( fd==stdin && intss() && inquire(stdin, _TTY) )
347: freopen("*src", "rt", stdin);
348: #endif
349:
350: yyin = fileptrs[0] = fd;
351: yylineno = filelines[0] = 1;
352: filedepth = 0;
353: ateof = 0;
354:
355: do {
356: nerrs = 0;
357: nwarns = 0;
358: eofneed = 0;
359: forcerr = 0;
360: comneed = 0;
361: optneed = 0;
362: defneed = 0;
363: lettneed = 0;
364: iobrlevel = 0;
365: prevbg = 0;
366:
367: constno = 0;
368: labno = 0;
369: nxtstno = 0;
370: afterif = 0;
371: thisexec = 0;
372: thisctl = 0;
373: nxtindif = 0;
374: inproc = 0;
375: blklevel = 0;
376:
377: implinit();
378:
379: opiis();
380: swii(icfile);
381:
382: if(k = yyparse())
383: fprintf(diagfile, "Error in source file.\n");
384: else switch(graal)
385: {
386: case PARSERR:
387: /*
388: fprintf(diagfile, "error\n");
389: */
390: break;
391:
392: case PARSEOF:
393: break;
394:
395: case PARSOPT:
396: propts();
397: break;
398:
399: case PARSDCL:
400: fprintf(diagfile, "external declaration\n");
401: break;
402:
403: case PARSPROC:
404: /* work already done in endproc */
405: break;
406:
407: case PARSDEF:
408: break;
409: }
410:
411: cliis();
412: if(nerrs) ++nbad;
413:
414: } while(graal!=PARSEOF && !ateof);
415: }
416:
417: ptr bgnproc()
418: {
419: ptr bgnexec();
420:
421: if(blklevel > 0)
422: {
423: execerr("procedure %s terminated prematurely", procnm() );
424: endproc();
425: }
426: ctllevel = 0;
427: procname = 0;
428: procclass = 0;
429: thisargs = 0;
430: dclsect = 0;
431: blklevel = 1;
432: nftnm0 = nftnames;
433: dclsect = 1;
434: ndecl[1] = 0;
435: nhid[1] = 0;
436:
437: thisctl = allexcblock();
438: thisctl->tag = TCONTROL;
439: thisctl->subtype = STPROC;
440: inproc = 1;
441: return( bgnexec() );
442: }
443:
444:
445: endproc()
446: {
447: char comline[50], *concat();
448: ptr p;
449:
450: inproc = 0;
451:
452: if(nerrs == 0)
453: {
454: pass2();
455: unhide();
456: cleanst();
457: if(dumpic)
458: system( concat("od ", icfile->filename, comline) );
459: if(memdump)
460: prmem();
461: }
462: else {
463: fprintf(diagfile, "**Procedure %s not generated\n", procnm());
464: for( ; blklevel > 0 ; --blklevel)
465: unhide();
466: cleanst();
467: }
468:
469: if(nerrs==0 && nwarns>0)
470: if(nwarns == 1)
471: fprintf(diagfile,"*1 warning\n");
472: else fprintf(diagfile, "*%d warnings\n", nwarns);
473:
474: blklevel = 0;
475: thisargs = 0;
476: procname = 0;
477: procclass = 0;
478: while(thisctl)
479: {
480: p = thisctl;
481: thisctl = thisctl->prevctl;
482: frexcblock(p);
483: }
484:
485: while(thisexec)
486: {
487: p = thisexec;
488: thisexec = thisexec->prevexec;
489: frexcblock(p);
490: }
491:
492: nftnames = nftnm0;
493: #if SIF_ALLOC
494: if(verbose)
495: {
496: fprintf(diagfile, "Highwater mark %d words. ", nmemused);
497: fprintf(diagfile, "%ld words left over\n", totalloc-totfreed);
498: }
499: #endif
500: }
501:
502:
503:
504:
505: implinit()
506: {
507: setimpl(TYREAL, 'a', 'z');
508: setimpl(TYINT, 'i', 'n');
509: }
510:
511:
512:
513: init()
514: {
515: eflftn[TYINT] = FTNINT;
516: eflftn[TYREAL] = FTNREAL;
517: eflftn[TYLREAL] = FTNDOUBLE;
518: eflftn[TYLOG] = FTNLOG;
519: eflftn[TYCOMPLEX] = FTNCOMPLEX;
520: eflftn[TYCHAR] = FTNINT;
521: eflftn[TYFIELD] = FTNINT;
522: eflftn[TYLCOMPLEX] = FTNDOUBLE;
523: }
524:
525:
526:
527:
528: #ifdef gcos
529: meter()
530: {
531: FILE *mout;
532: char *cuserid(), *datime(), *s;
533: if(equals(s = cuserid(), "efl")) return;
534: mout = fopen("efl/eflmeter", "a");
535: if(mout == NULL)
536: fprintf(diagfile,"cannot open meter file");
537:
538: else {
539: fprintf(mout, "%s user %s at %s\n",
540: ( rutss()? "tss " : "batch"), s, datime() );
541: fclose(mout);
542: }
543: }
544: #endif
545:
546:
547:
548: #ifdef unix
549: meter() /* temporary metering of non-SIF usage */
550: {
551: FILE *mout;
552: int tvec[2];
553: int uid;
554: char *ctime(), *p;
555:
556: uid = getuid() & 0377;
557: if(uid == 91) return; /* ignore sif uses */
558: mout = fopen("/usr/sif/efl/Meter", "a");
559: if(mout == NULL)
560: fprintf(diagfile, "cannot open meter file");
561: else {
562: time(tvec);
563: p = ctime(tvec);
564: p[16] = '\0';
565: fprintf(mout,"User %d, %s\n", uid, p+4);
566: fclose(mout);
567: }
568: }
569:
570: intrupt()
571: {
572: done(0);
573: }
574: #endif
575:
576:
577: done(k)
578: int k;
579: {
580: rmiis();
581: exit(k);
582: }
583:
584:
585:
586:
587:
588: /* if string has an embedded equal sign, set option with it*/
589: eqlstrng(s)
590: char *s;
591: {
592: register char *t;
593:
594: for(t = s; *t; ++t)
595: if(*t == '=')
596: {
597: *t = '\0';
598: while( *++t == ' ' )
599: ;
600: if(*t == '\0')
601: t = NULL;
602: setopt(s, t);
603: return(YES);
604: }
605:
606: return(NO);
607: }
608:
609: #ifdef gcos
610:
611: /* redirect output unit */
612:
613: gcoutf()
614: {
615: if (!intss())
616: {
617: fputs("\t\t Version 2.10 : read INFO/EFL (03/27/80)\n", stderr);
618: if (compile)
619: {
620: static char name[80] = "s*", opts[20] = "yw";
621: char *opt = (char *)inquire(stdout, _OPTIONS);
622: if (!strchr(opt, 't'))
623: { /* if stdout is diverted */
624: sprintf(name, "%s\"s*\"",
625: (char *)inquire(stdout, _FILENAME));
626: strcpy(&opts[1], opt);
627: }
628: if (freopen(name, opts, stdout) == NULL)
629: cant(name);
630: }
631: }
632: }
633:
634:
635:
636: /* call in fortran compiler if necessary */
637:
638: gccomp()
639: {
640: if (compile)
641: {
642: if (nbad > 0) /* abort */
643: cretsw(EXEC);
644:
645: else { /* good: call forty */
646: FILE *dstar; /* to intercept "gosys" action */
647:
648: if ((dstar = fopen("d*", "wv")) == NULL)
649: cant("d*");
650: fputs("$\tforty\tascii", dstar);
651: if (fopen("*1", "o") == NULL)
652: cant("*1");
653: fclose(stdout, "rl");
654: cretsw(FORM | LNO | BCD);
655: if (! tailor.ftncontnu)
656: compile |= FORM;
657: csetsw(compile);
658: gosys("forty");
659: }
660: }
661: }
662:
663:
664: cant(s)
665: char *s;
666: {
667: ffiler(s);
668: done(1);
669: }
670: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.