BSD 4 development
[unix-history] / .ref-5cb41021d721f4e0ac572d592613f963e495d1ff / .ref-BSD-3 / usr / src / cmd / f77 / main.c
CommitLineData
47621762
BJ
1char *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
11main(argc, argv)
12int argc;
13char **argv;
14{
15char *s;
16int k, retcode, *ip;
17FILEP opf();
18int flovflo();
19
20#define DONE(c) { retcode = c; goto finis; }
21
22signal(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
33while(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
145if(argc != 4)
146 fatali("arg count %d", argc);
147asmfile = opf(argv[1]);
148initfile = opf(argv[2]);
149textfile = opf(argv[3]);
150
151initkey();
152if(inilex( copys(argv[0]) ))
153 DONE(1);
154fprintf(diagfile, "%s:\n", argv[0]);
155
156#ifdef SDB
157for(s = argv[0] ; ; s += 8)
158 {
159 prstab(s,N_SO,0,0);
160 if( strlen(s) < 8 )
161 break;
162 }
163#endif
164
165fileinit();
166procinit();
167if(k = yyparse())
168 {
169 fprintf(diagfile, "Bad parse, return code %d\n", k);
170 DONE(1);
171 }
172if(nerr > 0)
173 DONE(1);
174if(parstate != OUTSIDE)
175 {
176 warn("missing END statement");
177 endproc();
178 }
179doext();
180preven(ALIDOUBLE);
181prtail();
182#if FAMILY==PCC
183 puteof();
184#endif
185
186if(nerr > 0)
187 DONE(1);
188DONE(0);
189
190
191finis:
192 done(retcode);
193 return(retcode);
194}
195
196
197
198done(k)
199int k;
200{
201static int recurs = NO;
202
203if(recurs == NO)
204 {
205 recurs = YES;
206 clfiles();
207 }
208exit(k);
209}
210
211
212LOCAL FILEP opf(fn)
213char *fn;
214{
215FILEP fp;
216if( fp = fopen(fn, "w") )
217 return(fp);
218
219fatalstr("cannot open intermediate file %s", fn);
220/* NOTREACHED */
221}
222
223
224
225LOCAL clfiles()
226{
227clf(&textfile);
228clf(&asmfile);
229clf(&initfile);
230}
231
232
233clf(p)
234FILEP *p;
235{
236if(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
248flovflo()
249{
250err("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
258signal(SIGFPE, flovflo);
259}