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