1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)main.c 5.2 (Berkeley) 8/29/85";
15: #endif not lint
16:
17: /*
18: * main.c
19: *
20: * Main routine for the f77 compiler, pass 1, 4.2 BSD.
21: *
22: * University of Utah CS Dept modification history:
23: *
24: * $Log: main.c,v $
25: * Revision 5.2 85/08/10 04:57:16 donn
26: * Jerry Berkman's changes to ifdef 66 code and add -r8/double flag..
27: *
28: * Revision 5.1 85/08/10 03:48:26 donn
29: * 4.3 alpha
30: *
31: * Revision 3.2 85/01/14 04:21:31 donn
32: * Added changes to implement Jerry's '-q' option.
33: *
34: * Revision 3.1 84/10/29 05:47:03 donn
35: * Added Jerry Berkman's change to line buffer stderr.
36: *
37: */
38:
39: char *xxxvers[] = "\n@(#) FORTRAN 77 PASS 1, VERSION 2.10, 16 AUGUST 1980\n";
40:
41: #include "defs.h"
42: #include <signal.h>
43:
44: #ifdef SDB
45: # include <a.out.h>
46: # ifndef N_SO
47: # include <stab.h>
48: # endif
49: #endif
50:
51:
52: LOCAL char *textname = "";
53: LOCAL char *asmname = "";
54: LOCAL char *initname = "";
55:
56:
57: extern intexit();
58:
59: flag namesflag = YES;
60:
61:
62:
63: main(argc, argv)
64: int argc;
65: char **argv;
66: {
67: char *s;
68: int k, retcode, *ip;
69: FILEP opf();
70: int flovflo();
71:
72: #define DONE(c) { retcode = c; goto finis; }
73:
74: signal(SIGFPE, flovflo); /* catch overflows */
75: signal(SIGINT, intexit);
76:
77: #if HERE == PDP11
78: ldfps(01200); /* trap on overflow */
79: #endif
80:
81:
82: setlinebuf(diagfile);
83:
84: --argc;
85: ++argv;
86:
87: while(argc>0 && argv[0][0]=='-')
88: {
89: for(s = argv[0]+1 ; *s ; ++s) switch(*s)
90: {
91: case 'w':
92: if(s[1]=='6' && s[2]=='6')
93: {
94: ftn66flag = YES;
95: s += 2;
96: }
97: else
98: nowarnflag = YES;
99: break;
100:
101: case 'U':
102: shiftcase = NO;
103: break;
104:
105: case 'u':
106: undeftype = YES;
107: break;
108:
109: case 'O':
110: optimflag = YES;
111: break;
112:
113: case 'd':
114: debugflag[0] = YES;
115:
116: while (*s == 'd' || *s == ',')
117: {
118: k = 0;
119: while( isdigit(*++s) )
120: k = 10*k + (*s - '0');
121: if(k < 0 || k >= MAXDEBUGFLAG)
122: fatali("bad debug number %d",k);
123: debugflag[k] = YES;
124: }
125: break;
126:
127: case 'p':
128: profileflag = YES;
129: break;
130:
131: case '8':
132: dblflag = YES;
133: break;
134:
135: case 'C':
136: checksubs = YES;
137: break;
138:
139: #ifdef ONLY66
140: case '6':
141: no66flag = YES;
142: noextflag = YES;
143: break;
144: #endif
145:
146: case '1':
147: onetripflag = YES;
148: break;
149:
150: #ifdef SDB
151: case 'g':
152: sdbflag = YES;
153: break;
154: #endif
155:
156: case 'q':
157: namesflag = NO;
158: break;
159:
160: case 'N':
161: switch(*++s)
162: {
163: case 'q':
164: ip = &maxequiv; goto getnum;
165: case 'x':
166: ip = &maxext; goto getnum;
167: case 's':
168: ip = &maxstno; goto getnum;
169: case 'c':
170: ip = &maxctl; goto getnum;
171: case 'n':
172: ip = &maxhash; goto getnum;
173:
174: default:
175: fatali("invalid flag -N%c", *s);
176: }
177: getnum:
178: k = 0;
179: while( isdigit(*++s) )
180: k = 10*k + (*s - '0');
181: if(k <= 0)
182: fatal("Table size too small");
183: *ip = k;
184: break;
185:
186: case 'i':
187: if(*++s == '2')
188: tyint = TYSHORT;
189: else if(*s == '4')
190: {
191: shortsubs = NO;
192: tyint = TYLONG;
193: }
194: else if(*s == 's')
195: shortsubs = YES;
196: else
197: fatali("invalid flag -i%c\n", *s);
198: tylogical = tyint;
199: break;
200:
201: default:
202: fatali("invalid flag %c\n", *s);
203: }
204: --argc;
205: ++argv;
206: }
207:
208: if(argc != 4)
209: fatali("arg count %d", argc);
210: textname = argv[3];
211: initname = argv[2];
212: asmname = argv[1];
213: asmfile = opf(argv[1]);
214: initfile = opf(argv[2]);
215: textfile = opf(argv[3]);
216:
217: initkey();
218: if(inilex( copys(argv[0]) ))
219: DONE(1);
220: if(namesflag == YES)
221: fprintf(diagfile, "%s:\n", argv[0]);
222:
223: #ifdef SDB
224: filenamestab(argv[0]);
225: #endif
226:
227: fileinit();
228: procinit();
229: if(k = yyparse())
230: {
231: fprintf(diagfile, "Bad parse, return code %d\n", k);
232: DONE(1);
233: }
234: if(nerr > 0)
235: DONE(1);
236: if(parstate != OUTSIDE)
237: {
238: warn("missing END statement");
239: endproc();
240: }
241: doext();
242: preven(ALIDOUBLE);
243: prtail();
244: #if FAMILY==PCC
245: puteof();
246: #endif
247:
248: if(nerr > 0)
249: DONE(1);
250: DONE(0);
251:
252:
253: finis:
254: done(retcode);
255: }
256:
257:
258:
259: done(k)
260: int k;
261: {
262: static char *ioerror = "i/o error on intermediate file %s\n";
263:
264: if (textfile != NULL && textfile != stdout)
265: {
266: if (ferror(textfile))
267: {
268: fprintf(diagfile, ioerror, textname);
269: k = 3;
270: }
271: fclose(textfile);
272: }
273:
274: if (asmfile != NULL && asmfile != stdout)
275: {
276: if (ferror(asmfile))
277: {
278: fprintf(diagfile, ioerror, asmname);
279: k = 3;
280: }
281: fclose(asmfile);
282: }
283:
284: if (initfile != NULL && initfile != stdout)
285: {
286: if (ferror(initfile))
287: {
288: fprintf(diagfile, ioerror, initname);
289: k = 3;
290: }
291: fclose(initfile);
292: }
293:
294: rmtmpfiles();
295:
296: exit(k);
297: }
298:
299:
300: LOCAL FILEP opf(fn)
301: char *fn;
302: {
303: FILEP fp;
304: if( fp = fopen(fn, "w") )
305: return(fp);
306:
307: fatalstr("cannot open intermediate file %s", fn);
308: /* NOTREACHED */
309: }
310:
311:
312:
313: clf(p)
314: FILEP *p;
315: {
316: if(p!=NULL && *p!=NULL && *p!=stdout)
317: {
318: if(ferror(*p))
319: fatal("writing error");
320: fclose(*p);
321: }
322: *p = NULL;
323: }
324:
325:
326:
327:
328: flovflo()
329: {
330: err("floating exception during constant evaluation");
331: #if HERE == VAX
332: fatal("vax cannot recover from floating exception");
333: rmtmpfiles();
334: /* vax returns a reserved operand that generates
335: an illegal operand fault on next instruction,
336: which if ignored causes an infinite loop.
337: */
338: #endif
339: signal(SIGFPE, flovflo);
340: }
341:
342:
343:
344: rmtmpfiles()
345: {
346: close(vdatafile);
347: unlink(vdatafname);
348: close(vchkfile);
349: unlink(vchkfname);
350: close(cdatafile);
351: unlink(cdatafname);
352: close(cchkfile);
353: unlink(cchkfname);
354: }
355:
356:
357:
358: intexit()
359: {
360: done(1);
361: }
Defined functions
clf
defined in line
313; used 1 times
done
defined in line
259; used 25 times
- in line 254,
360
- in /usr/src/usr.bin/f77/src/f77pass1/data.c line
2052,
2069,
2151,
2158,
2178,
2188,
2433,
2509-2510(2),
2580,
2587,
2596-2600(2)
- in /usr/src/usr.bin/f77/src/f77pass1/error.c line
153
- in /usr/src/usr.bin/f77/src/f77pass1/lex.c line
197
- in /usr/src/usr.bin/f77/src/f77pass1/vax.c line
562,
571,
600,
639,
704,
713,
759,
799
main
defined in line
63;
never used
opf
defined in line
300; used 4 times
Defined variables
Defined macros
DONE
defined in line
72; used 5 times