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