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