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