xref: /csrg-svn/usr.bin/pascal/pxp/pp.c (revision 2861)
1*2861Speter static	char *sccsid = "@(#)pp.c	1.1 (Berkeley) 03/02/81";
2*2861Speter /* Copyright (c) 1979 Regents of the University of California */
3*2861Speter #
4*2861Speter /*
5*2861Speter  * pxp - Pascal execution profiler
6*2861Speter  *
7*2861Speter  * Bill Joy UCB
8*2861Speter  * Version 1.2 January 1979
9*2861Speter  */
10*2861Speter 
11*2861Speter #include "0.h"
12*2861Speter 
13*2861Speter #define noprint() nopflg
14*2861Speter 
15*2861Speter int	pplev[3];	/* STAT, DECL, PRFN */
16*2861Speter int	nopflg;
17*2861Speter 
18*2861Speter setprint()
19*2861Speter {
20*2861Speter 
21*2861Speter 	if (profile == 0) {
22*2861Speter 		if (table)
23*2861Speter 			nopflg = 1;
24*2861Speter 		else
25*2861Speter 			nopflg = 0;
26*2861Speter 		return;
27*2861Speter 	}
28*2861Speter 	nopflg = !all && nowcnt() == 0 || !opt('z');
29*2861Speter }
30*2861Speter 
31*2861Speter printon()
32*2861Speter {
33*2861Speter 
34*2861Speter 	if (profile == 0) {
35*2861Speter 		if (table)
36*2861Speter 			nopflg = 1;
37*2861Speter 		return;
38*2861Speter 	}
39*2861Speter 	nopflg = 0;
40*2861Speter }
41*2861Speter 
42*2861Speter printoff()
43*2861Speter {
44*2861Speter 
45*2861Speter 	nopflg = 1;
46*2861Speter }
47*2861Speter 
48*2861Speter ppkw(s)
49*2861Speter 	register char *s;
50*2861Speter {
51*2861Speter 	register char *cp, i;
52*2861Speter 
53*2861Speter 	if (noprint())
54*2861Speter 		return;
55*2861Speter 	/*
56*2861Speter 	 * First real thing printed
57*2861Speter 	 * is always a keyword
58*2861Speter 	 * or includes an "id" (if a comment)
59*2861Speter 	 * (See ppnl below)
60*2861Speter 	 */
61*2861Speter 	hadsome = 1;
62*2861Speter 	if (underline) {
63*2861Speter 		for (cp = s; *cp; cp++)
64*2861Speter 			putchar('_');
65*2861Speter 		for (cp = s; *cp; cp++)
66*2861Speter 			putchar('\b');
67*2861Speter 	}
68*2861Speter 	printf(s);
69*2861Speter }
70*2861Speter 
71*2861Speter ppid(s)
72*2861Speter 	register char *s;
73*2861Speter {
74*2861Speter 
75*2861Speter 	if (noprint())
76*2861Speter 		return;
77*2861Speter 	hadsome = 1;
78*2861Speter 	if (s == NIL)
79*2861Speter 		s = "{identifier}";
80*2861Speter 	printf(s);
81*2861Speter }
82*2861Speter 
83*2861Speter ppbra(s)
84*2861Speter 	char *s;
85*2861Speter {
86*2861Speter 
87*2861Speter 	if (noprint())
88*2861Speter 		return;
89*2861Speter 	if (s != NIL)
90*2861Speter 		printf(s);
91*2861Speter }
92*2861Speter 
93*2861Speter ppsep(s)
94*2861Speter 	char *s;
95*2861Speter {
96*2861Speter 
97*2861Speter 	if (noprint())
98*2861Speter 		return;
99*2861Speter 	printf(s);
100*2861Speter }
101*2861Speter 
102*2861Speter ppket(s)
103*2861Speter 	char *s;
104*2861Speter {
105*2861Speter 
106*2861Speter 	if (noprint())
107*2861Speter 		return;
108*2861Speter 	if (s != NIL)
109*2861Speter 		printf(s);
110*2861Speter }
111*2861Speter 
112*2861Speter char	killsp;
113*2861Speter 
114*2861Speter ppunspac()
115*2861Speter {
116*2861Speter 
117*2861Speter 	killsp = 1;
118*2861Speter }
119*2861Speter 
120*2861Speter ppspac()
121*2861Speter {
122*2861Speter 
123*2861Speter 	if (killsp) {
124*2861Speter 		killsp = 0;
125*2861Speter 		return;
126*2861Speter 	}
127*2861Speter 	if (noprint())
128*2861Speter 		return;
129*2861Speter 	putchar(' ');
130*2861Speter }
131*2861Speter 
132*2861Speter ppitem()
133*2861Speter {
134*2861Speter 
135*2861Speter 	if (noprint())
136*2861Speter 		return;
137*2861Speter 	ppnl();
138*2861Speter 	indent();
139*2861Speter }
140*2861Speter 
141*2861Speter int	owenl, owenlb;
142*2861Speter 
143*2861Speter ppsnlb()
144*2861Speter {
145*2861Speter 
146*2861Speter 	if (nopflg)
147*2861Speter 		return;
148*2861Speter 	owenlb++;
149*2861Speter }
150*2861Speter 
151*2861Speter ppsnl()
152*2861Speter {
153*2861Speter 
154*2861Speter 	if (nopflg)
155*2861Speter 		return;
156*2861Speter 	owenl++;
157*2861Speter }
158*2861Speter 
159*2861Speter pppay()
160*2861Speter {
161*2861Speter 
162*2861Speter 	while (owenl || owenlb) {
163*2861Speter 		putchar('\n');
164*2861Speter 		if (owenlb) {
165*2861Speter 			putchar(' ');
166*2861Speter 			owenlb--;
167*2861Speter 		} else
168*2861Speter 			owenl--;
169*2861Speter 	}
170*2861Speter }
171*2861Speter 
172*2861Speter ppnl()
173*2861Speter {
174*2861Speter 
175*2861Speter 	if (noprint())
176*2861Speter 		return;
177*2861Speter 	if (hadsome == 0)
178*2861Speter 		return;
179*2861Speter 	pppay();
180*2861Speter 	putchar('\n');
181*2861Speter }
182*2861Speter 
183*2861Speter indent()
184*2861Speter {
185*2861Speter 	register i;
186*2861Speter 
187*2861Speter 	if (noprint())
188*2861Speter 		return;
189*2861Speter 	linopr();
190*2861Speter 	if (profile == 0) {
191*2861Speter 		indent1(pplev[PRFN] + pplev[DECL] + pplev[STAT]);
192*2861Speter 		return;
193*2861Speter 	}
194*2861Speter 	indent1(pplev[PRFN] + pplev[STAT]);
195*2861Speter 	switch (i = shudpcnt()) {
196*2861Speter 		case 1:
197*2861Speter 			printf("%7.7ld.", nowcnt());
198*2861Speter 			dashes('-');
199*2861Speter 			putchar('|');
200*2861Speter 			break;
201*2861Speter 		case 0:
202*2861Speter 		case -1:
203*2861Speter 			printf("        ");
204*2861Speter 			dashes(' ');
205*2861Speter 			putchar(i == 0 ? '|' : ' ');
206*2861Speter 			break;
207*2861Speter 	}
208*2861Speter 	indent1(pplev[DECL]);
209*2861Speter }
210*2861Speter 
211*2861Speter dashes(c)
212*2861Speter 	char c;
213*2861Speter {
214*2861Speter 	register i;
215*2861Speter 
216*2861Speter 	for (i = unit - 1; i != 0; i--)
217*2861Speter 		putchar(c);
218*2861Speter }
219*2861Speter 
220*2861Speter indent1(in)
221*2861Speter 	int in;
222*2861Speter {
223*2861Speter 	register i;
224*2861Speter 
225*2861Speter 	if (noprint())
226*2861Speter 		return;
227*2861Speter 	i = in;
228*2861Speter 	if (profile == 0)
229*2861Speter 		while (i >= 8) {
230*2861Speter 			putchar('\t');
231*2861Speter 			i =- 8;
232*2861Speter 		}
233*2861Speter 	while (i > 0) {
234*2861Speter 		putchar(' ');
235*2861Speter 		i--;
236*2861Speter 	}
237*2861Speter }
238*2861Speter 
239*2861Speter linopr()
240*2861Speter {
241*2861Speter 
242*2861Speter 	if (noprint())
243*2861Speter 		return;
244*2861Speter 	if (profile) {
245*2861Speter 		if (line < 0)
246*2861Speter 			line = -line;
247*2861Speter 		printf("%6d  ", line);
248*2861Speter 	}
249*2861Speter }
250*2861Speter 
251*2861Speter indentlab()
252*2861Speter {
253*2861Speter 
254*2861Speter 	indent1(pplev[PRFN]);
255*2861Speter }
256*2861Speter 
257*2861Speter ppop(s)
258*2861Speter 	char *s;
259*2861Speter {
260*2861Speter 
261*2861Speter 	if (noprint())
262*2861Speter 		return;
263*2861Speter 	printf(s);
264*2861Speter }
265*2861Speter 
266*2861Speter ppnumb(s)
267*2861Speter 	char *s;
268*2861Speter {
269*2861Speter 
270*2861Speter 	if (noprint())
271*2861Speter 		return;
272*2861Speter 	if (s == NIL)
273*2861Speter 		s = "{number}";
274*2861Speter 	printf(s);
275*2861Speter }
276*2861Speter 
277*2861Speter ppgoin(lv)
278*2861Speter {
279*2861Speter 
280*2861Speter 	pplev[lv] =+ unit;
281*2861Speter }
282*2861Speter 
283*2861Speter ppgoout(lv)
284*2861Speter {
285*2861Speter 
286*2861Speter 	pplev[lv] =- unit;
287*2861Speter 	if (pplev[lv] < 0)
288*2861Speter 		panic("pplev");
289*2861Speter }
290*2861Speter 
291*2861Speter ppstr(s)
292*2861Speter 	char *s;
293*2861Speter {
294*2861Speter 	register char *cp;
295*2861Speter 
296*2861Speter 	if (noprint())
297*2861Speter 		return;
298*2861Speter 	if (s == NIL) {
299*2861Speter 		printf("{string}");
300*2861Speter 		return;
301*2861Speter 	}
302*2861Speter 	putchar('\'');
303*2861Speter 	cp = s;
304*2861Speter 	while (*cp) {
305*2861Speter 		putchar(*cp);
306*2861Speter 		if (*cp == '\'')
307*2861Speter 			putchar('\'');
308*2861Speter 		cp++;
309*2861Speter 	}
310*2861Speter 	putchar('\'');
311*2861Speter }
312*2861Speter 
313*2861Speter pplab(s)
314*2861Speter 	char *s;
315*2861Speter {
316*2861Speter 
317*2861Speter 	if (noprint())
318*2861Speter 		return;
319*2861Speter 	if (s == NIL)
320*2861Speter 		s = "{integer label}";
321*2861Speter 	printf(s);
322*2861Speter }
323*2861Speter 
324*2861Speter int	outcol;
325*2861Speter 
326*2861Speter 
327*2861Speter putchar(c)
328*2861Speter 	char c;
329*2861Speter {
330*2861Speter 
331*2861Speter 	putc(c, stdout);
332*2861Speter 	if (ferror(stdout))
333*2861Speter 		outerr();
334*2861Speter 	switch (c) {
335*2861Speter 		case '\n':
336*2861Speter 			outcol = 0;
337*2861Speter 			flush();
338*2861Speter 			break;
339*2861Speter 		case '\t':
340*2861Speter 			outcol =+ 8;
341*2861Speter 			outcol =& ~07;
342*2861Speter 			break;
343*2861Speter 		case '\b':
344*2861Speter 			if (outcol)
345*2861Speter 				outcol--;
346*2861Speter 			break;
347*2861Speter 		default:
348*2861Speter 			outcol++;
349*2861Speter 		case '\f':
350*2861Speter 			break;
351*2861Speter 	}
352*2861Speter }
353*2861Speter 
354*2861Speter flush()
355*2861Speter {
356*2861Speter 
357*2861Speter 	fflush(stdout);
358*2861Speter 	if (ferror(stdout))
359*2861Speter 		outerr();
360*2861Speter }
361*2861Speter 
362*2861Speter pptab()
363*2861Speter {
364*2861Speter 	register int i;
365*2861Speter 
366*2861Speter 	if (noprint())
367*2861Speter 		return;
368*2861Speter 	i = pplev[PRFN] + profile ? 44 + unit : 28;
369*2861Speter /*
370*2861Speter 	if (outcol > i + 8) {
371*2861Speter 		ppnl();
372*2861Speter 		i =+ 8;
373*2861Speter 	}
374*2861Speter */
375*2861Speter 	do
376*2861Speter 		putchar('\t');
377*2861Speter 	while (outcol < i);
378*2861Speter }
379*2861Speter 
380*2861Speter outerr()
381*2861Speter {
382*2861Speter 
383*2861Speter 	perror(stdoutn);
384*2861Speter 	pexit(DIED);
385*2861Speter }
386