xref: /csrg-svn/usr.bin/pascal/pxp/main.c (revision 2858)
1*2858Speter static	char *sccsid = "@(#)main.c	1.1 (Berkeley) 03/02/81";
2*2858Speter /* Copyright (c) 1979 Regents of the University of California */
3*2858Speter #
4*2858Speter /*
5*2858Speter  * pxp - Pascal execution profiler
6*2858Speter  *
7*2858Speter  * Bill Joy UCB
8*2858Speter  * Version 1.2 January 1979
9*2858Speter  */
10*2858Speter 
11*2858Speter #include "0.h"
12*2858Speter 
13*2858Speter /*
14*2858Speter  * This program is described in detail in the "PXP 1.0 Implementation Notes"
15*2858Speter  *
16*2858Speter  * The structure of pxp is very similar to that of the translator pi.
17*2858Speter  * The major new pieces here are a set of profile data maintenance
18*2858Speter  * routines in the file pmon.c and a set of pretty printing utility
19*2858Speter  * routines in the file pp.c.
20*2858Speter  * The semantic routines of pi have been rewritten to do a simple
21*2858Speter  * reformatting tree walk, the parsing and scanning remains
22*2858Speter  * the same.
23*2858Speter  *
24*2858Speter  * This version does not place more than one statement per line and
25*2858Speter  * is not very intelligent about folding long lines, with only
26*2858Speter  * an ad hoc way of folding case label list and enumerated type
27*2858Speter  * declarations being implemented.
28*2858Speter  */
29*2858Speter 
30*2858Speter char	usagestr[] =
31*2858Speter 	"pxp [ -acdefjntuw_ ] [ -23456789 ] [ -z [ name ... ] ] name.p";
32*2858Speter char	*howfile =	"/usr/lib/how_pxp";
33*2858Speter char	*stdoutn =	"Standard output";
34*2858Speter 
35*2858Speter int	unit =	4;
36*2858Speter 
37*2858Speter FILE	*ibuf;
38*2858Speter extern	char errout;
39*2858Speter 
40*2858Speter /*
41*2858Speter  * Main program for pxp.
42*2858Speter  * Process options, then call yymain
43*2858Speter  * to do all the real work.
44*2858Speter  */
45*2858Speter FILE *ibp;
46*2858Speter main(argc, argv)
47*2858Speter 	int argc;
48*2858Speter 	char *argv[];
49*2858Speter {
50*2858Speter 	register char *cp;
51*2858Speter 	register c;
52*2858Speter 
53*2858Speter 	if (argv[0][0] == 'a')
54*2858Speter 		howfile =+ 9;
55*2858Speter 	argc--, argv++;
56*2858Speter 	if (argc == 0) {
57*2858Speter 		execl("/bin/cat", "cat", howfile, 0);
58*2858Speter 		goto usage;
59*2858Speter 	}
60*2858Speter 	while (argc > 0) {
61*2858Speter 		cp = argv[0];
62*2858Speter 		if (*cp++ != '-')
63*2858Speter 			break;
64*2858Speter 		while (c = *cp++) switch (c) {
65*2858Speter #ifdef DEBUG
66*2858Speter 			case 'T':
67*2858Speter 				typetest++;
68*2858Speter 				continue;
69*2858Speter 			case 'A':
70*2858Speter 				testtrace++;
71*2858Speter 			case 'F':
72*2858Speter 				fulltrace++;
73*2858Speter 			case 'E':
74*2858Speter 				errtrace++;
75*2858Speter 				continue;
76*2858Speter 			case 'C':
77*2858Speter 				yycosts();
78*2858Speter 				pexit(NOSTART);
79*2858Speter 			case 'U':
80*2858Speter 				yyunique++;
81*2858Speter 				continue;
82*2858Speter #endif
83*2858Speter 			case 'a':
84*2858Speter 				all++;
85*2858Speter 				continue;
86*2858Speter 			case 'c':
87*2858Speter 				core++;
88*2858Speter 				continue;
89*2858Speter 			case 'd':
90*2858Speter 				nodecl++;
91*2858Speter 				continue;
92*2858Speter 			case 'e':
93*2858Speter 				noinclude = -1;
94*2858Speter 				continue;
95*2858Speter 			case 'f':
96*2858Speter 				full++;
97*2858Speter 				continue;
98*2858Speter 			case 'j':
99*2858Speter 				justify++;
100*2858Speter 				continue;
101*2858Speter 			case 'l':
102*2858Speter 			case 'n':
103*2858Speter 				togopt(c);
104*2858Speter 				continue;
105*2858Speter 			case 'o':
106*2858Speter 				onefile++;
107*2858Speter 				continue;
108*2858Speter 			case 's':
109*2858Speter 				stripcomm++;
110*2858Speter 				continue;
111*2858Speter 			case 't':
112*2858Speter 				table++;
113*2858Speter 				continue;
114*2858Speter 			case 'u':
115*2858Speter 			case 'w':
116*2858Speter 				togopt(c);
117*2858Speter 				continue;
118*2858Speter 			case 'z':
119*2858Speter 				profile++;
120*2858Speter 				pflist = argv + 1;
121*2858Speter 				pflstc = 0;
122*2858Speter 				while (argc > 1) {
123*2858Speter 					if (dotted(argv[1], 'p'))
124*2858Speter 						break;
125*2858Speter 					pflstc++, argc--, argv++;
126*2858Speter 				}
127*2858Speter 				if (pflstc == 0)
128*2858Speter 					togopt(c);
129*2858Speter 				else
130*2858Speter 					nojunk++;
131*2858Speter 				continue;
132*2858Speter 			case '_':
133*2858Speter 				underline++;
134*2858Speter 				continue;
135*2858Speter 			default:
136*2858Speter 				if (c >= '2' && c <= '9') {
137*2858Speter 					unit = c - '0';
138*2858Speter 					continue;
139*2858Speter 				}
140*2858Speter usage:
141*2858Speter 				Perror("Usage", usagestr);
142*2858Speter 				exit(1);
143*2858Speter 		}
144*2858Speter 		argc--, argv++;
145*2858Speter 	}
146*2858Speter 	if (core && !profile && !table)
147*2858Speter 		profile++;
148*2858Speter 	if (argc == 0 || argc > 2)
149*2858Speter 		goto usage;
150*2858Speter 	if (profile || table) {
151*2858Speter 		noinclude = 0;
152*2858Speter 		if (argc == 2) {
153*2858Speter 			argc--;
154*2858Speter 			getit(argv[1]);
155*2858Speter 		} else
156*2858Speter 			getit(core ? "core" : "pmon.out");
157*2858Speter 	} else
158*2858Speter 		noinclude++;
159*2858Speter 	if (argc != 1)
160*2858Speter 		goto usage;
161*2858Speter 	firstname = filename = argv[0];
162*2858Speter 	if (dotted(filename, 'i')) {
163*2858Speter 		if (profile || table)
164*2858Speter 			goto usage;
165*2858Speter 		noinclude = 1;
166*2858Speter 		bracket++;
167*2858Speter 	} else if (!dotted(filename, 'p')) {
168*2858Speter 		Perror(filename, "Name must end in '.p'");
169*2858Speter 		exit(1);
170*2858Speter 	}
171*2858Speter 	if ((ibuf = fopen(filename, "r")) == NULL)
172*2858Speter 		perror(filename), pexit(NOSTART);
173*2858Speter 	ibp = ibuf;
174*2858Speter 	if (onefile) {
175*2858Speter 		int onintr();
176*2858Speter 
177*2858Speter 		cp = (stdoutn = "/tmp/pxp00000") + 13;
178*2858Speter 		signal(2, onintr);
179*2858Speter 		for (c = getpid(); c; c =/ 10)
180*2858Speter 			*--cp =| (c % 10);
181*2858Speter 		if (freopen(stdoutn, "w", stdout) == NULL)
182*2858Speter bad:
183*2858Speter 			perror(stdoutn), exit(1);
184*2858Speter 	} else {
185*2858Speter 		extern char _sobuf[BUFSIZ];
186*2858Speter 		setbuf(stdout, _sobuf);
187*2858Speter 	}
188*2858Speter 	if (profile || opt('l')) {
189*2858Speter 		opt('n')++;
190*2858Speter 		yysetfile(filename);
191*2858Speter 		opt('n')--;
192*2858Speter 	} else
193*2858Speter 		lastname = filename;
194*2858Speter 	errout = 2;
195*2858Speter 	yymain();
196*2858Speter 	/* No return */
197*2858Speter }
198*2858Speter 
199*2858Speter /*
200*2858Speter  * Put a header on a top of a page
201*2858Speter  */
202*2858Speter header()
203*2858Speter {
204*2858Speter 	extern char version[];
205*2858Speter 	static char reenter;
206*2858Speter 	extern int outcol;
207*2858Speter 
208*2858Speter 	gettime();
209*2858Speter 	if (reenter) {
210*2858Speter 		if (outcol)
211*2858Speter 			putchar('\n');
212*2858Speter 		putchar('\f');
213*2858Speter 	}
214*2858Speter 	reenter++;
215*2858Speter 	if (profile || table) {
216*2858Speter 		printf("Berkeley Pascal PXP -- Version 1.1 (%s)\n\n%s  %s\n\n", version, myctime(&tvec), filename);
217*2858Speter 		printf("Profiled %s\n\n", myctime(&ptvec));
218*2858Speter 	}
219*2858Speter }
220*2858Speter 
221*2858Speter char	ugh[] =	"Fatal error in pxp\n";
222*2858Speter /*
223*2858Speter  * Exit from the Pascal system.
224*2858Speter  * We throw in an ungraceful termination
225*2858Speter  * message if c > 1 indicating a severe
226*2858Speter  * error such as running out of memory
227*2858Speter  * or an internal inconsistency.
228*2858Speter  */
229*2858Speter pexit(c)
230*2858Speter 	int c;
231*2858Speter {
232*2858Speter 	register char *cp;
233*2858Speter 	extern int outcol;
234*2858Speter 
235*2858Speter 	if (stdoutn[0] == '/')
236*2858Speter 		unlink(stdoutn);
237*2858Speter 	if (outcol)
238*2858Speter 		putchar('\n');
239*2858Speter 	flush();
240*2858Speter 	if (c == DIED)
241*2858Speter 		write(2, ugh, sizeof ugh);
242*2858Speter 	exit(c);
243*2858Speter }
244*2858Speter 
245*2858Speter onintr()
246*2858Speter {
247*2858Speter 
248*2858Speter 	pexit(DIED);
249*2858Speter }
250*2858Speter 
251*2858Speter puthedr()
252*2858Speter {
253*2858Speter 
254*2858Speter 	yysetfile(filename);
255*2858Speter }
256