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