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