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