xref: /csrg-svn/usr.bin/pascal/pxp/stat.c (revision 3052)
1*3052Smckusic static	char *sccsid = "@(#)stat.c	1.2 (Berkeley) 03/07/81";
22865Speter /* Copyright (c) 1979 Regents of the University of California */
32865Speter #
42865Speter /*
52865Speter  * pxp - Pascal execution profiler
62865Speter  *
72865Speter  * Bill Joy UCB
82865Speter  * Version 1.2 January 1979
92865Speter  */
102865Speter 
112865Speter #include "0.h"
122865Speter #include "tree.h"
132865Speter 
142865Speter int cntstat;
15*3052Smckusic int cnts = 3;
162865Speter 
172865Speter statlist(r)
182865Speter 	int *r;
192865Speter {
202865Speter 	register int *sl;
212865Speter 
222865Speter 	sl = r;
232865Speter 	if (sl != NIL)
242865Speter 		for (;;) {
252865Speter 			statement(sl[1]);
262865Speter 			sl = sl[2];
272865Speter 			if (sl == NIL)
282865Speter 				break;
292865Speter 			ppsep(";");
302865Speter 		}
312865Speter 	else
322865Speter 		statement(NIL);
332865Speter }
342865Speter 
352865Speter 
362865Speter statement(r)
372865Speter 	int *r;
382865Speter {
392865Speter 	register int *s;
402865Speter 
412865Speter 	s = r;
422865Speter top:
432865Speter 	if (cntstat) {
442865Speter 		cntstat = 0;
452865Speter 		getcnt();
462865Speter 	}
472865Speter 	if (s == NIL) {
482865Speter 		putcm();
492865Speter 		ppitem();
502865Speter 		ppid("null");
512865Speter 		return;
522865Speter 	}
532865Speter 	if (s[0] == T_REPEAT)
542865Speter 		setinfo(s[1]);
552865Speter 	else
562865Speter 		setline(s[1]);
572865Speter 	if (s[0] == T_LABEL) {
582865Speter 		cntstat = 1;
592865Speter 		ppnl();
602865Speter 		labeled(s[2]);
612865Speter 		statement(s[3]);
622865Speter 		return;
632865Speter 	}
642865Speter 	switch (s[0]) {
652865Speter 		default:
662865Speter 			panic("stat");
672865Speter 		case T_PCALL:
682865Speter 			ppitem();
692865Speter 			proc(s);
702865Speter 			break;
712865Speter 		case T_IF:
722865Speter 		case T_IFEL:
732865Speter 			ppnl();
742865Speter 			indent();
752865Speter 			ifop(s);
762865Speter 			break;
772865Speter 		case T_WHILE:
782865Speter 			ppnl();
792865Speter 			indent();
802865Speter 			whilop(s);
812865Speter 			break;
822865Speter 		case T_REPEAT:
832865Speter 			ppnl();
842865Speter 			indent();
852865Speter 			repop(s);
862865Speter 			break;
872865Speter 		case T_FORU:
882865Speter 		case T_FORD:
892865Speter 			ppnl();
902865Speter 			indent();
912865Speter 			forop(s);
922865Speter 			break;
932865Speter 		case T_BLOCK:
942865Speter 			ppnl();
952865Speter 			indent();
962865Speter 			ppstbl(s, DECL);
972865Speter 			break;
982865Speter 		case T_ASGN:
992865Speter 			ppitem();
1002865Speter 			asgnop(s);
1012865Speter 			break;
1022865Speter 		case T_GOTO:
1032865Speter 			ppitem();
1042865Speter 			gotoop(s[2]);
1052865Speter 			cntstat = 1;
1062865Speter 			break;
1072865Speter 		case T_CASE:
1082865Speter 			ppnl();
1092865Speter 			indent();
1102865Speter 			caseop(s);
1112865Speter 			break;
1122865Speter 		case T_WITH:
1132865Speter 			ppnl();
1142865Speter 			indent();
1152865Speter 			withop(s);
1162865Speter 			break;
1172865Speter 		case T_ASRT:
1182865Speter 			ppitem();
1192865Speter 			asrtop(s);
1202865Speter 			break;
1212865Speter 	}
1222865Speter 	setinfo(s[1]);
1232865Speter 	putcm();
1242865Speter }
1252865Speter 
1262865Speter withop(s)
1272865Speter 	int *s;
1282865Speter {
1292865Speter 	register *p;
1302865Speter 
1312865Speter 	ppkw("with");
1322865Speter 	ppspac();
1332865Speter 	p = s[2];
1342865Speter 	if (p != NIL)
1352865Speter 		for (;;) {
1362865Speter 			lvalue(p[1]);
1372865Speter 			p = p[2];
1382865Speter 			if (p == NIL)
1392865Speter 				break;
1402865Speter 			ppsep(", ");
1412865Speter 		}
1422865Speter 	else
1432865Speter 		ppid("{record variable list}");
1442865Speter 	ppstdo(s[3], DECL);
1452865Speter }
1462865Speter 
1472865Speter asgnop(r)
1482865Speter 	int *r;
1492865Speter {
1502865Speter 
1512865Speter 	lvalue(r[2]);
1522865Speter 	ppsep(" := ");
1532865Speter 	rvalue(r[3], NIL);
1542865Speter }
1552865Speter 
1562865Speter forop(r)
1572865Speter 	int *r;
1582865Speter {
1592865Speter 	struct pxcnt scnt;
1602865Speter 
1612865Speter 	savecnt(&scnt);
1622865Speter 	ppkw("for");
1632865Speter 	ppspac();
1642865Speter 	asgnop(r[2]);
1652865Speter 	ppspac();
1662865Speter 	ppkw(r[0] == T_FORU ? "to" : "downto");
1672865Speter 	ppspac();
1682865Speter 	rvalue(r[3], NIL);
1692865Speter 	getcnt();
1702865Speter 	ppstdo(r[4], STAT);
1712865Speter 	if (rescnt(&scnt))
1722865Speter 		getcnt();
1732865Speter }
1742865Speter 
1752865Speter ifop(r)
1762865Speter 	int *r;
1772865Speter {
1782865Speter 	register *s;
1792865Speter 	struct pxcnt scnt;
1802865Speter 
1812865Speter 	ppkw("if");
1822865Speter 	ppspac();
1832865Speter 	rvalue(r[2], NIL);
1842865Speter 	ppspac();
1852865Speter 	ppkw("then");
1862865Speter 	ppspac();
1872865Speter 	s = r[3];
1882865Speter 	savecnt(&scnt);
1892865Speter 	getcnt();
1902865Speter 	if (s != NIL && s[0] == T_BLOCK)
1912865Speter 		ppstbl1(s, STAT);
1922865Speter 	else {
1932865Speter 		ppgoin(STAT);
1942865Speter 		statement(s);
1952865Speter 		ppgoout(STAT);
1962865Speter 	}
1972865Speter 	if (r[0] == T_IFEL) {
1982865Speter 		setcnt(cntof(&scnt)-nowcnt());
1992865Speter 		if (s == NIL || s[0] != T_BLOCK) {
2002865Speter 			ppnl();
2012865Speter 			indent();
2022865Speter 		} else {
2032865Speter 			ppstbl2();
2042865Speter 			ppspac();
2052865Speter 		}
2062865Speter 		s = r[4];
2072865Speter 		ppkw("else");
2082865Speter 		unprint();
2092865Speter 		ppspac();
2102865Speter 		if (s == NIL)
2112865Speter 			goto burp;
2122865Speter 		if (s[0] == T_BLOCK)
2132865Speter 			ppstbl1(s, STAT);
2142865Speter 		else if (s[0] == T_IF || s[0] == T_IFEL)
2152865Speter 			ifop(s);
2162865Speter 		else {
2172865Speter burp:
2182865Speter 			ppgoin(STAT);
2192865Speter 			statement(s);
2202865Speter 			ppgoout(STAT);
2212865Speter 		}
2222865Speter 	}
2232865Speter 	if (rescnt(&scnt))
2242865Speter 		getcnt();
2252865Speter 	if (r[4] != NIL)
2262865Speter 		unprint();
2272865Speter 	if (s != NIL && s[0] == T_BLOCK)
2282865Speter 		ppstbl2();
2292865Speter }
2302865Speter 
2312865Speter whilop(r)
2322865Speter 	int *r;
2332865Speter {
2342865Speter 	struct pxcnt scnt;
2352865Speter 
2362865Speter 	ppkw("while");
2372865Speter 	ppspac();
2382865Speter 	rvalue(r[2], NIL);
2392865Speter 	savecnt(&scnt);
2402865Speter 	getcnt();
2412865Speter 	ppstdo(r[3], STAT);
2422865Speter 	if (rescnt(&scnt))
2432865Speter 		getcnt();
2442865Speter }
2452865Speter 
2462865Speter repop(r)
2472865Speter 	int *r;
2482865Speter {
2492865Speter 	struct pxcnt scnt;
2502865Speter 
2512865Speter 	ppkw("repeat");
2522865Speter 	ppgoin(STAT);
2532865Speter 	savecnt(&scnt);
2542865Speter 	getcnt();
2552865Speter 	statlist(r[2]);
2562865Speter 	ppgoout(DECL);
2572865Speter 	ppnl();
2582865Speter 	indent();
2592865Speter 	ppkw("until");
2602865Speter 	ppspac();
2612865Speter 	rvalue(r[3], NIL);
2622865Speter 	ppgoin(DECL);
2632865Speter 	ppgoout(STAT);
2642865Speter 	if (rescnt(&scnt))
2652865Speter 		getcnt();
2662865Speter }
2672865Speter 
2682865Speter ppstbl(r, m)
2692865Speter int *r;
2702865Speter {
2712865Speter 	ppstbl1(r, m);
2722865Speter 	ppstbl2();
2732865Speter }
2742865Speter 
2752865Speter ppstbl1(r, m)
2762865Speter int *r;
2772865Speter {
2782865Speter 	ppkw("begin");
2792865Speter 	ppgoin(m);
2802865Speter 	statlist(r[2]);
2812865Speter 	ppgoout(m);
2822865Speter }
2832865Speter 
2842865Speter ppstbl2()
2852865Speter {
2862865Speter 	ppnl();
2872865Speter 	indent();
2882865Speter 	ppkw("end");
2892865Speter }
2902865Speter 
2912865Speter ppstdo(r, l)
2922865Speter int *r;
2932865Speter {
2942865Speter 	register *s;
2952865Speter 
2962865Speter 	ppspac();
2972865Speter 	ppkw("do");
2982865Speter 	ppspac();
2992865Speter 	s = r;
3002865Speter 	if (s != NIL && s[0] == T_BLOCK)
3012865Speter 		ppstbl(s, l);
3022865Speter 	else {
3032865Speter 		ppgoin(l);
3042865Speter 		statement(s);
3052865Speter 		ppgoout(l);
3062865Speter 	}
3072865Speter }
3082865Speter 
3092865Speter asrtop(s)
3102865Speter 	int *s;
3112865Speter {
3122865Speter 
3132865Speter 	ppkw("assert");
3142865Speter 	ppspac();
3152865Speter 	rvalue(s[2], NIL);
3162865Speter }
317