|
|
1.1 root 1: static char *sccsid = "@(#)stat.c 1.3 (Berkeley) 8/30/82";
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: #include "tree.h"
13:
14: int cntstat;
15: int cnts = 3;
16:
17: statlist(r)
18: int *r;
19: {
20: register int *sl;
21:
22: sl = r;
23: if (sl != NIL)
24: for (;;) {
25: statement(sl[1]);
26: sl = sl[2];
27: if (sl == NIL)
28: break;
29: ppsep(";");
30: }
31: else
32: statement(NIL);
33: }
34:
35:
36: statement(r)
37: int *r;
38: {
39: register int *s;
40:
41: s = r;
42: top:
43: if (cntstat) {
44: cntstat = 0;
45: getcnt();
46: }
47: if (s == NIL) {
48: putcm();
49: ppitem();
50: ppid("null");
51: return;
52: }
53: if (s[0] == T_REPEAT)
54: setinfo(s[1]);
55: else
56: setline(s[1]);
57: if (s[0] == T_LABEL) {
58: cntstat = 1;
59: ppnl();
60: labeled(s[2]);
61: statement(s[3]);
62: return;
63: }
64: switch (s[0]) {
65: default:
66: panic("stat");
67: case T_PCALL:
68: ppitem();
69: proc(s);
70: break;
71: case T_IF:
72: case T_IFEL:
73: ppnl();
74: indent();
75: ifop(s);
76: break;
77: case T_WHILE:
78: ppnl();
79: indent();
80: whilop(s);
81: break;
82: case T_REPEAT:
83: ppnl();
84: indent();
85: repop(s);
86: break;
87: case T_FORU:
88: case T_FORD:
89: ppnl();
90: indent();
91: forop(s);
92: break;
93: case T_BLOCK:
94: ppnl();
95: indent();
96: ppstbl(s, DECL);
97: break;
98: case T_ASGN:
99: ppitem();
100: asgnop(s);
101: break;
102: case T_GOTO:
103: ppitem();
104: gotoop(s[2]);
105: cntstat = 1;
106: break;
107: case T_CASE:
108: ppnl();
109: indent();
110: caseop(s);
111: break;
112: case T_WITH:
113: ppnl();
114: indent();
115: withop(s);
116: break;
117: }
118: setinfo(s[1]);
119: putcm();
120: }
121:
122: withop(s)
123: int *s;
124: {
125: register *p;
126:
127: ppkw("with");
128: ppspac();
129: p = s[2];
130: if (p != NIL)
131: for (;;) {
132: lvalue(p[1]);
133: p = p[2];
134: if (p == NIL)
135: break;
136: ppsep(", ");
137: }
138: else
139: ppid("{record variable list}");
140: ppstdo(s[3], DECL);
141: }
142:
143: asgnop(r)
144: int *r;
145: {
146:
147: lvalue(r[2]);
148: ppsep(" := ");
149: rvalue(r[3], NIL);
150: }
151:
152: forop(r)
153: int *r;
154: {
155: struct pxcnt scnt;
156:
157: savecnt(&scnt);
158: ppkw("for");
159: ppspac();
160: asgnop(r[2]);
161: ppspac();
162: ppkw(r[0] == T_FORU ? "to" : "downto");
163: ppspac();
164: rvalue(r[3], NIL);
165: getcnt();
166: ppstdo(r[4], STAT);
167: if (rescnt(&scnt))
168: getcnt();
169: }
170:
171: ifop(r)
172: int *r;
173: {
174: register *s;
175: struct pxcnt scnt;
176:
177: ppkw("if");
178: ppspac();
179: rvalue(r[2], NIL);
180: ppspac();
181: ppkw("then");
182: ppspac();
183: s = r[3];
184: savecnt(&scnt);
185: getcnt();
186: if (s != NIL && s[0] == T_BLOCK)
187: ppstbl1(s, STAT);
188: else {
189: ppgoin(STAT);
190: statement(s);
191: ppgoout(STAT);
192: }
193: if (r[0] == T_IFEL) {
194: setcnt(cntof(&scnt)-nowcnt());
195: if (s == NIL || s[0] != T_BLOCK) {
196: ppnl();
197: indent();
198: } else {
199: ppstbl2();
200: ppspac();
201: }
202: s = r[4];
203: ppkw("else");
204: unprint();
205: ppspac();
206: if (s == NIL)
207: goto burp;
208: if (s[0] == T_BLOCK)
209: ppstbl1(s, STAT);
210: else if (s[0] == T_IF || s[0] == T_IFEL)
211: ifop(s);
212: else {
213: burp:
214: ppgoin(STAT);
215: statement(s);
216: ppgoout(STAT);
217: }
218: }
219: if (rescnt(&scnt))
220: getcnt();
221: if (r[4] != NIL)
222: unprint();
223: if (s != NIL && s[0] == T_BLOCK)
224: ppstbl2();
225: }
226:
227: whilop(r)
228: int *r;
229: {
230: struct pxcnt scnt;
231:
232: ppkw("while");
233: ppspac();
234: rvalue(r[2], NIL);
235: savecnt(&scnt);
236: getcnt();
237: ppstdo(r[3], STAT);
238: if (rescnt(&scnt))
239: getcnt();
240: }
241:
242: repop(r)
243: int *r;
244: {
245: struct pxcnt scnt;
246:
247: ppkw("repeat");
248: ppgoin(STAT);
249: savecnt(&scnt);
250: getcnt();
251: statlist(r[2]);
252: ppgoout(DECL);
253: ppnl();
254: indent();
255: ppkw("until");
256: ppspac();
257: rvalue(r[3], NIL);
258: ppgoin(DECL);
259: ppgoout(STAT);
260: if (rescnt(&scnt))
261: getcnt();
262: }
263:
264: ppstbl(r, m)
265: int *r;
266: {
267: ppstbl1(r, m);
268: ppstbl2();
269: }
270:
271: ppstbl1(r, m)
272: int *r;
273: {
274: ppkw("begin");
275: ppgoin(m);
276: statlist(r[2]);
277: ppgoout(m);
278: }
279:
280: ppstbl2()
281: {
282: ppnl();
283: indent();
284: ppkw("end");
285: }
286:
287: ppstdo(r, l)
288: int *r;
289: {
290: register *s;
291:
292: ppspac();
293: ppkw("do");
294: ppspac();
295: s = r;
296: if (s != NIL && s[0] == T_BLOCK)
297: ppstbl(s, l);
298: else {
299: ppgoin(l);
300: statement(s);
301: ppgoout(l);
302: }
303: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.