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