1*48112Sbostic /*- 2*48112Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48112Sbostic * All rights reserved. 4*48112Sbostic * 5*48112Sbostic * %sccs.include.redist.c% 622239Sdist */ 722239Sdist 822239Sdist #ifndef lint 9*48112Sbostic static char sccsid[] = "@(#)stat.c 5.2 (Berkeley) 04/16/91"; 10*48112Sbostic #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 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 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 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 1512865Speter asgnop(r) 1522865Speter int *r; 1532865Speter { 1542865Speter 1552865Speter lvalue(r[2]); 1562865Speter ppsep(" := "); 1572865Speter rvalue(r[3], NIL); 1582865Speter } 1592865Speter 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 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 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 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 2722865Speter ppstbl(r, m) 2732865Speter int *r; 2742865Speter { 2752865Speter ppstbl1(r, m); 2762865Speter ppstbl2(); 2772865Speter } 2782865Speter 2792865Speter ppstbl1(r, m) 2802865Speter int *r; 2812865Speter { 2822865Speter ppkw("begin"); 2832865Speter ppgoin(m); 2842865Speter statlist(r[2]); 2852865Speter ppgoout(m); 2862865Speter } 2872865Speter 2882865Speter ppstbl2() 2892865Speter { 2902865Speter ppnl(); 2912865Speter indent(); 2922865Speter ppkw("end"); 2932865Speter } 2942865Speter 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