share subr.c and string.c with pi/pc
[unix-history] / usr / src / usr.bin / pascal / pxp / stat.c
CommitLineData
ebd61f12 1static char *sccsid = "@(#)stat.c 2.1 (Berkeley) %G%";
769b93e6
PK
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
14int cntstat;
f4e01610 15int cnts = 3;
769b93e6
PK
16
17statlist(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
36statement(r)
37 int *r;
38{
39 register int *s;
40
41 s = r;
42top:
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;
769b93e6
PK
117 }
118 setinfo(s[1]);
119 putcm();
120}
121
122withop(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
143asgnop(r)
144 int *r;
145{
146
147 lvalue(r[2]);
148 ppsep(" := ");
149 rvalue(r[3], NIL);
150}
151
152forop(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
171ifop(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 {
213burp:
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
227whilop(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
242repop(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
264ppstbl(r, m)
265int *r;
266{
267 ppstbl1(r, m);
268 ppstbl2();
269}
270
271ppstbl1(r, m)
272int *r;
273{
274 ppkw("begin");
275 ppgoin(m);
276 statlist(r[2]);
277 ppgoout(m);
278}
279
280ppstbl2()
281{
282 ppnl();
283 indent();
284 ppkw("end");
285}
286
287ppstdo(r, l)
288int *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}