|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: static char copyright[] =
4: "@(#)Copyright (c) 1979 Regents of the University of California";
5:
6: static char sccsid[] = "@(#)main.c 1.9 6/10/83";
7:
8: #include "whoami.h"
9: #include "0.h"
10: #include "yy.h"
11: #include <signal.h>
12: #include "objfmt.h"
13: #include "config.h"
14:
15: /*
16: * This version of pi has been in use at Berkeley since May 1977
17: * and is very stable. Please report any problems with the error
18: * recovery to the second author at the address given in the file
19: * READ_ME. The second author takes full responsibility for any bugs
20: * in the syntactic error recovery.
21: */
22:
23: char piusage[] = "pi [ -blnpstuw ] [ -i file ... ] name.p";
24: char pixusage[] = "pix [ -blnpstuw ] [ -i file ... ] name.p [ arg ... ]";
25: char pcusage[] = "pc [ options ] [ -o file ] [ -i file ... ] name.p";
26:
27: char *usageis = piusage;
28:
29: #ifdef OBJ
30: char *obj = "obj";
31: #endif OBJ
32: #ifdef PC
33: char *pcname = "pc.pc0";
34: #endif PC
35: #ifdef PTREE
36: char *pTreeName = "pi.pTree";
37: #endif PTREE
38:
39: int onintr();
40:
41: extern char *lastname;
42:
43: FILE *ibuf;
44: FILE *pcstream = NULL;
45:
46: /*
47: * these are made real variables
48: * so they can be changed
49: * if you are compiling on a smaller machine
50: */
51: double MAXINT = 2147483647.;
52: double MININT = -2147483648.;
53:
54: /*
55: * Main program for pi.
56: * Process options, then call yymain
57: * to do all the real work.
58: */
59: main(argc, argv)
60: int argc;
61: char *argv[];
62: {
63: register char *cp;
64: register c;
65: int i;
66:
67: if (argv[0][0] == 'a')
68: err_file += err_pathlen , how_file += how_pathlen;
69: # ifdef OBJ
70: if (argv[0][0] == '-' && argv[0][1] == 'o') {
71: obj = &argv[0][2];
72: usageis = pixusage;
73: how_file[strlen(how_file)] = 'x';
74: ofil = 3;
75: } else {
76: ofil = creat(obj, 0755);
77: if (ofil < 0) {
78: perror(obj);
79: pexit(NOSTART);
80: }
81: }
82: # endif OBJ
83: argv++, argc--;
84: if (argc == 0) {
85: i = fork();
86: if (i == -1)
87: goto usage;
88: if (i == 0) {
89: execl("/bin/cat", "cat", how_file, 0);
90: goto usage;
91: }
92: while (wait(&i) != -1)
93: continue;
94: pexit(NOSTART);
95: }
96: # ifdef OBJ
97: opt('p') = opt('t') = opt('b') = 1;
98: #ifdef vax
99: /* pdx is currently supported only on the vax */
100: opt('g') = 1;
101: #endif vax
102: while (argc > 0) {
103: cp = argv[0];
104: if (*cp++ != '-')
105: break;
106: while (c = *cp++) switch (c) {
107: #ifdef DEBUG
108: case 'k':
109: case 'r':
110: case 'y':
111: togopt(c);
112: continue;
113: case 'K':
114: yycosts();
115: pexit(NOSTART);
116: case 'A':
117: testtrace = TRUE;
118: case 'F':
119: fulltrace = TRUE;
120: case 'E':
121: errtrace = TRUE;
122: opt('r')++;
123: continue;
124: case 'U':
125: yyunique = 0;
126: continue;
127: #endif
128: case 'b':
129: opt('b') = 2;
130: continue;
131: case 'i':
132: pflist = argv + 1;
133: pflstc = 0;
134: while (argc > 1) {
135: if (dotted(argv[1], 'p'))
136: break;
137: pflstc++, argc--, argv++;
138: }
139: if (pflstc == 0)
140: goto usage;
141: continue;
142: case 'g':
143: case 'l':
144: case 'n':
145: case 'p':
146: case 's':
147: case 't':
148: case 'u':
149: case 'w':
150: togopt(c);
151: continue;
152: case 'z':
153: monflg = TRUE;
154: continue;
155: default:
156: usage:
157: Perror( "Usage", usageis);
158: pexit(NOSTART);
159: }
160: argc--, argv++;
161: }
162: # endif OBJ
163: # ifdef PC
164: opt( 'b' ) = 1;
165: opt( 'g' ) = 0;
166: opt( 't' ) = 0;
167: opt( 'p' ) = 0;
168: usageis = pcusage;
169: while ( argc > 0 ) {
170: cp = argv[0];
171: if ( *cp++ != '-' ) {
172: break;
173: }
174: c = *cp++;
175: switch( c ) {
176: #ifdef DEBUG
177: case 'k':
178: case 'r':
179: case 'y':
180: togopt(c);
181: break;
182: case 'K':
183: yycosts();
184: pexit(NOSTART);
185: case 'A':
186: testtrace = TRUE;
187: /* and fall through */
188: case 'F':
189: fulltrace = TRUE;
190: /* and fall through */
191: case 'E':
192: errtrace = TRUE;
193: opt('r')++;
194: break;
195: case 'U':
196: yyunique = 0;
197: break;
198: #endif
199: case 'b':
200: opt('b') = 2;
201: break;
202: case 'i':
203: pflist = argv + 1;
204: pflstc = 0;
205: while (argc > 1) {
206: if (dotted(argv[1], 'p'))
207: break;
208: pflstc++, argc--, argv++;
209: }
210: if (pflstc == 0)
211: goto usage;
212: break;
213: /*
214: * output file for the first pass
215: */
216: case 'o':
217: if ( argc < 2 ) {
218: goto usage;
219: }
220: argv++;
221: argc--;
222: pcname = argv[0];
223: break;
224: case 'J':
225: togopt( 'J' );
226: break;
227: case 'C':
228: /*
229: * since -t is an ld switch, use -C
230: * to turn on tests
231: */
232: togopt( 't' );
233: break;
234: case 'g':
235: /*
236: * sdb symbol table
237: */
238: togopt( 'g' );
239: break;
240: case 'l':
241: case 's':
242: case 'u':
243: case 'w':
244: togopt(c);
245: break;
246: case 'p':
247: /*
248: * -p on the command line means profile
249: */
250: profflag = TRUE;
251: break;
252: case 'z':
253: monflg = TRUE;
254: break;
255: default:
256: usage:
257: Perror( "Usage", usageis);
258: pexit(NOSTART);
259: }
260: argc--;
261: argv++;
262: }
263: # endif PC
264: if (argc != 1)
265: goto usage;
266: efil = open ( err_file, 0 );
267: if ( efil < 0 )
268: perror(err_file), pexit(NOSTART);
269: filename = argv[0];
270: if (!dotted(filename, 'p')) {
271: Perror(filename, "Name must end in '.p'");
272: pexit(NOSTART);
273: }
274: close(0);
275: if ( ( ibuf = fopen( filename , "r" ) ) == NULL )
276: perror(filename), pexit(NOSTART);
277: ibp = ibuf;
278: # ifdef PC
279: if ( ( pcstream = fopen( pcname , "w" ) ) == NULL ) {
280: perror( pcname );
281: pexit( NOSTART );
282: }
283: stabsource( filename );
284: # endif PC
285: # ifdef PTREE
286: # define MAXpPAGES 16
287: if ( ! pCreate( pTreeName , MAXpPAGES ) ) {
288: perror( pTreeName );
289: pexit( NOSTART );
290: }
291: # endif PTREE
292: if ( signal( SIGINT , SIG_IGN ) != SIG_IGN )
293: signal( SIGINT , onintr );
294: if (opt('l')) {
295: opt('n')++;
296: yysetfile(filename);
297: opt('n')--;
298: }
299: yymain();
300: /* No return */
301: }
302:
303: pchr(c)
304: char c;
305: {
306:
307: putc ( c , stdout );
308: }
309:
310: char ugh[] = "Fatal error in pi\n";
311: /*
312: * Exit from the Pascal system.
313: * We throw in an ungraceful termination
314: * message if c > 1 indicating a severe
315: * error such as running out of memory
316: * or an internal inconsistency.
317: */
318: pexit(c)
319: int c;
320: {
321:
322: if (opt('l') && c != DIED && c != NOSTART)
323: while (getline() != -1)
324: continue;
325: yyflush();
326: switch (c) {
327: case DIED:
328: write(2, ugh, sizeof ugh);
329: case NOSTART:
330: case ERRS:
331: # ifdef OBJ
332: if (ofil > 0)
333: unlink(obj);
334: /*
335: * remove symbol table temp files
336: */
337: removenlfile();
338:
339: # endif OBJ
340: # ifdef PC
341: if ( pcstream != NULL ) {
342: unlink( pcname );
343: }
344: # endif PC
345: break;
346: case AOK:
347: # ifdef OBJ
348: pflush();
349: /*
350: * copy symbol table temp files to obj file
351: */
352: copynlfile();
353:
354: # endif OBJ
355: # ifdef PC
356: puteof();
357: # endif PC
358: break;
359: }
360: /*
361: * this to gather statistics on programs being compiled
362: * taken 20 june 79 ... peter
363: *
364: * if (fork() == 0) {
365: * char *cp = "-0";
366: * cp[1] += c;
367: * execl("/usr/lib/gather", "gather", cp, filename, 0);
368: * exit(1);
369: * }
370: */
371: # ifdef PTREE
372: pFinish();
373: # endif
374: exit(c);
375: }
376:
377: onintr()
378: {
379:
380: signal( SIGINT , SIG_IGN );
381: pexit(NOSTART);
382: }
383:
384: /*
385: * Get an error message from the error message file
386: */
387: geterr(seekpt, buf)
388: int seekpt;
389: char *buf;
390: {
391:
392: lseek(efil, (long) seekpt, 0);
393: if (read(efil, buf, 256) <= 0)
394: perror(err_file), pexit(DIED);
395: }
396:
397: header()
398: {
399: extern char *version;
400: static char anyheaders;
401:
402: gettime( filename );
403: if (anyheaders && opt('n'))
404: putc( '\f' , stdout );
405: anyheaders++;
406: # ifdef OBJ
407: printf("Berkeley Pascal PI -- Version %s\n\n%s %s\n\n",
408: version, myctime(&tvec), filename);
409: # endif OBJ
410: # ifdef PC
411: printf("Berkeley Pascal PC -- Version %s\n\n%s %s\n\n",
412: version, myctime(&tvec), filename);
413: # endif PC
414: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.