|
|
1.1 root 1: char *xxxvers[] = "\n@(#) FORTRAN 77 PASS 1, VERSION 2.10, 16 AUGUST 1980\n";
2:
3: #include "defs.h"
4: #include <signal.h>
5:
6: #ifdef SDB
7: # include <a.out.h>
8: # ifndef N_SO
9: # include <stab.h>
10: # endif
11: #endif
12:
13:
14: LOCAL char *textname = "";
15: LOCAL char *asmname = "";
16: LOCAL char *initname = "";
17:
18:
19: extern intexit();
20:
21:
22: main(argc, argv)
23: int argc;
24: char **argv;
25: {
26: char *s;
27: int k, retcode, *ip;
28: FILEP opf();
29: int flovflo();
30:
31: #define DONE(c) { retcode = c; goto finis; }
32:
33: signal(SIGFPE, flovflo); /* catch overflows */
34: signal(SIGINT, intexit);
35:
36: #if HERE == PDP11
37: ldfps(01200); /* trap on overflow */
38: #endif
39:
40:
41:
42: --argc;
43: ++argv;
44:
45: while(argc>0 && argv[0][0]=='-')
46: {
47: for(s = argv[0]+1 ; *s ; ++s) switch(*s)
48: {
49: case 'w':
50: if(s[1]=='6' && s[2]=='6')
51: {
52: ftn66flag = YES;
53: s += 2;
54: }
55: else
56: nowarnflag = YES;
57: break;
58:
59: case 'U':
60: shiftcase = NO;
61: break;
62:
63: case 'u':
64: undeftype = YES;
65: break;
66:
67: case 'O':
68: optimflag = YES;
69: break;
70:
71: case 'd':
72: debugflag[0] = YES;
73:
74: while (*s == 'd' || *s == ',')
75: {
76: k = 0;
77: while( isdigit(*++s) )
78: k = 10*k + (*s - '0');
79: if(k < 0 || k >= MAXDEBUGFLAG)
80: fatali("bad debug number %d",k);
81: debugflag[k] = YES;
82: }
83: break;
84:
85: case 'p':
86: profileflag = YES;
87: break;
88:
89: case 'C':
90: checksubs = YES;
91: break;
92:
93: case '6':
94: no66flag = YES;
95: noextflag = YES;
96: break;
97:
98: case '1':
99: onetripflag = YES;
100: break;
101:
102: #ifdef SDB
103: case 'g':
104: sdbflag = YES;
105: break;
106: #endif
107:
108: case 'N':
109: switch(*++s)
110: {
111: case 'q':
112: ip = &maxequiv; goto getnum;
113: case 'x':
114: ip = &maxext; goto getnum;
115: case 's':
116: ip = &maxstno; goto getnum;
117: case 'c':
118: ip = &maxctl; goto getnum;
119: case 'n':
120: ip = &maxhash; goto getnum;
121:
122: default:
123: fatali("invalid flag -N%c", *s);
124: }
125: getnum:
126: k = 0;
127: while( isdigit(*++s) )
128: k = 10*k + (*s - '0');
129: if(k <= 0)
130: fatal("Table size too small");
131: *ip = k;
132: break;
133:
134: case 'i':
135: if(*++s == '2')
136: tyint = TYSHORT;
137: else if(*s == '4')
138: {
139: shortsubs = NO;
140: tyint = TYLONG;
141: }
142: else if(*s == 's')
143: shortsubs = YES;
144: else
145: fatali("invalid flag -i%c\n", *s);
146: tylogical = tyint;
147: break;
148:
149: default:
150: fatali("invalid flag %c\n", *s);
151: }
152: --argc;
153: ++argv;
154: }
155:
156: if(argc != 4)
157: fatali("arg count %d", argc);
158: textname = argv[3];
159: initname = argv[2];
160: asmname = argv[1];
161: asmfile = opf(argv[1]);
162: initfile = opf(argv[2]);
163: textfile = opf(argv[3]);
164:
165: initkey();
166: if(inilex( copys(argv[0]) ))
167: DONE(1);
168: fprintf(diagfile, "%s:\n", argv[0]);
169:
170: #ifdef SDB
171: filenamestab(argv[0]);
172: #endif
173:
174: fileinit();
175: procinit();
176: if(k = yyparse())
177: {
178: fprintf(diagfile, "Bad parse, return code %d\n", k);
179: DONE(1);
180: }
181: if(nerr > 0)
182: DONE(1);
183: if(parstate != OUTSIDE)
184: {
185: warn("missing END statement");
186: endproc();
187: }
188: doext();
189: preven(ALIDOUBLE);
190: prtail();
191: #if FAMILY==PCC
192: puteof();
193: #endif
194:
195: if(nerr > 0)
196: DONE(1);
197: DONE(0);
198:
199:
200: finis:
201: done(retcode);
202: }
203:
204:
205:
206: done(k)
207: int k;
208: {
209: static char *ioerror = "i/o error on intermediate file %s\n";
210:
211: if (textfile != NULL && textfile != stdout)
212: {
213: if (ferror(textfile))
214: {
215: fprintf(diagfile, ioerror, textname);
216: k = 3;
217: }
218: fclose(textfile);
219: }
220:
221: if (asmfile != NULL && asmfile != stdout)
222: {
223: if (ferror(asmfile))
224: {
225: fprintf(diagfile, ioerror, asmname);
226: k = 3;
227: }
228: fclose(asmfile);
229: }
230:
231: if (initfile != NULL && initfile != stdout)
232: {
233: if (ferror(initfile))
234: {
235: fprintf(diagfile, ioerror, initname);
236: k = 3;
237: }
238: fclose(initfile);
239: }
240:
241: rmtmpfiles();
242:
243: exit(k);
244: }
245:
246:
247: LOCAL FILEP opf(fn)
248: char *fn;
249: {
250: FILEP fp;
251: if( fp = fopen(fn, "w") )
252: return(fp);
253:
254: fatalstr("cannot open intermediate file %s", fn);
255: /* NOTREACHED */
256: }
257:
258:
259:
260: clf(p)
261: FILEP *p;
262: {
263: if(p!=NULL && *p!=NULL && *p!=stdout)
264: {
265: if(ferror(*p))
266: fatal("writing error");
267: fclose(*p);
268: }
269: *p = NULL;
270: }
271:
272:
273:
274:
275: flovflo()
276: {
277: err("floating exception during constant evaluation");
278: #if HERE == VAX
279: fatal("vax cannot recover from floating exception");
280: rmtmpfiles();
281: /* vax returns a reserved operand that generates
282: an illegal operand fault on next instruction,
283: which if ignored causes an infinite loop.
284: */
285: #endif
286: signal(SIGFPE, flovflo);
287: }
288:
289:
290:
291: rmtmpfiles()
292: {
293: close(vdatafile);
294: unlink(vdatafname);
295: close(vchkfile);
296: unlink(vchkfname);
297: close(cdatafile);
298: unlink(cdatafname);
299: close(cchkfile);
300: unlink(cchkfname);
301: }
302:
303:
304:
305: intexit()
306: {
307: done(1);
308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.