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