1*2865Speter static char *sccsid = "@(#)stat.c 1.1 (Berkeley) 03/02/81"; 2*2865Speter /* Copyright (c) 1979 Regents of the University of California */ 3*2865Speter # 4*2865Speter /* 5*2865Speter * pxp - Pascal execution profiler 6*2865Speter * 7*2865Speter * Bill Joy UCB 8*2865Speter * Version 1.2 January 1979 9*2865Speter */ 10*2865Speter 11*2865Speter #include "0.h" 12*2865Speter #include "tree.h" 13*2865Speter 14*2865Speter int cntstat; 15*2865Speter int cnts 3; 16*2865Speter 17*2865Speter statlist(r) 18*2865Speter int *r; 19*2865Speter { 20*2865Speter register int *sl; 21*2865Speter 22*2865Speter sl = r; 23*2865Speter if (sl != NIL) 24*2865Speter for (;;) { 25*2865Speter statement(sl[1]); 26*2865Speter sl = sl[2]; 27*2865Speter if (sl == NIL) 28*2865Speter break; 29*2865Speter ppsep(";"); 30*2865Speter } 31*2865Speter else 32*2865Speter statement(NIL); 33*2865Speter } 34*2865Speter 35*2865Speter 36*2865Speter statement(r) 37*2865Speter int *r; 38*2865Speter { 39*2865Speter register int *s; 40*2865Speter 41*2865Speter s = r; 42*2865Speter top: 43*2865Speter if (cntstat) { 44*2865Speter cntstat = 0; 45*2865Speter getcnt(); 46*2865Speter } 47*2865Speter if (s == NIL) { 48*2865Speter putcm(); 49*2865Speter ppitem(); 50*2865Speter ppid("null"); 51*2865Speter return; 52*2865Speter } 53*2865Speter if (s[0] == T_REPEAT) 54*2865Speter setinfo(s[1]); 55*2865Speter else 56*2865Speter setline(s[1]); 57*2865Speter if (s[0] == T_LABEL) { 58*2865Speter cntstat = 1; 59*2865Speter ppnl(); 60*2865Speter labeled(s[2]); 61*2865Speter statement(s[3]); 62*2865Speter return; 63*2865Speter } 64*2865Speter switch (s[0]) { 65*2865Speter default: 66*2865Speter panic("stat"); 67*2865Speter case T_PCALL: 68*2865Speter ppitem(); 69*2865Speter proc(s); 70*2865Speter break; 71*2865Speter case T_IF: 72*2865Speter case T_IFEL: 73*2865Speter ppnl(); 74*2865Speter indent(); 75*2865Speter ifop(s); 76*2865Speter break; 77*2865Speter case T_WHILE: 78*2865Speter ppnl(); 79*2865Speter indent(); 80*2865Speter whilop(s); 81*2865Speter break; 82*2865Speter case T_REPEAT: 83*2865Speter ppnl(); 84*2865Speter indent(); 85*2865Speter repop(s); 86*2865Speter break; 87*2865Speter case T_FORU: 88*2865Speter case T_FORD: 89*2865Speter ppnl(); 90*2865Speter indent(); 91*2865Speter forop(s); 92*2865Speter break; 93*2865Speter case T_BLOCK: 94*2865Speter ppnl(); 95*2865Speter indent(); 96*2865Speter ppstbl(s, DECL); 97*2865Speter break; 98*2865Speter case T_ASGN: 99*2865Speter ppitem(); 100*2865Speter asgnop(s); 101*2865Speter break; 102*2865Speter case T_GOTO: 103*2865Speter ppitem(); 104*2865Speter gotoop(s[2]); 105*2865Speter cntstat = 1; 106*2865Speter break; 107*2865Speter case T_CASE: 108*2865Speter ppnl(); 109*2865Speter indent(); 110*2865Speter caseop(s); 111*2865Speter break; 112*2865Speter case T_WITH: 113*2865Speter ppnl(); 114*2865Speter indent(); 115*2865Speter withop(s); 116*2865Speter break; 117*2865Speter case T_ASRT: 118*2865Speter ppitem(); 119*2865Speter asrtop(s); 120*2865Speter break; 121*2865Speter } 122*2865Speter setinfo(s[1]); 123*2865Speter putcm(); 124*2865Speter } 125*2865Speter 126*2865Speter withop(s) 127*2865Speter int *s; 128*2865Speter { 129*2865Speter register *p; 130*2865Speter 131*2865Speter ppkw("with"); 132*2865Speter ppspac(); 133*2865Speter p = s[2]; 134*2865Speter if (p != NIL) 135*2865Speter for (;;) { 136*2865Speter lvalue(p[1]); 137*2865Speter p = p[2]; 138*2865Speter if (p == NIL) 139*2865Speter break; 140*2865Speter ppsep(", "); 141*2865Speter } 142*2865Speter else 143*2865Speter ppid("{record variable list}"); 144*2865Speter ppstdo(s[3], DECL); 145*2865Speter } 146*2865Speter 147*2865Speter asgnop(r) 148*2865Speter int *r; 149*2865Speter { 150*2865Speter 151*2865Speter lvalue(r[2]); 152*2865Speter ppsep(" := "); 153*2865Speter rvalue(r[3], NIL); 154*2865Speter } 155*2865Speter 156*2865Speter forop(r) 157*2865Speter int *r; 158*2865Speter { 159*2865Speter struct pxcnt scnt; 160*2865Speter 161*2865Speter savecnt(&scnt); 162*2865Speter ppkw("for"); 163*2865Speter ppspac(); 164*2865Speter asgnop(r[2]); 165*2865Speter ppspac(); 166*2865Speter ppkw(r[0] == T_FORU ? "to" : "downto"); 167*2865Speter ppspac(); 168*2865Speter rvalue(r[3], NIL); 169*2865Speter getcnt(); 170*2865Speter ppstdo(r[4], STAT); 171*2865Speter if (rescnt(&scnt)) 172*2865Speter getcnt(); 173*2865Speter } 174*2865Speter 175*2865Speter ifop(r) 176*2865Speter int *r; 177*2865Speter { 178*2865Speter register *s; 179*2865Speter struct pxcnt scnt; 180*2865Speter 181*2865Speter ppkw("if"); 182*2865Speter ppspac(); 183*2865Speter rvalue(r[2], NIL); 184*2865Speter ppspac(); 185*2865Speter ppkw("then"); 186*2865Speter ppspac(); 187*2865Speter s = r[3]; 188*2865Speter savecnt(&scnt); 189*2865Speter getcnt(); 190*2865Speter if (s != NIL && s[0] == T_BLOCK) 191*2865Speter ppstbl1(s, STAT); 192*2865Speter else { 193*2865Speter ppgoin(STAT); 194*2865Speter statement(s); 195*2865Speter ppgoout(STAT); 196*2865Speter } 197*2865Speter if (r[0] == T_IFEL) { 198*2865Speter setcnt(cntof(&scnt)-nowcnt()); 199*2865Speter if (s == NIL || s[0] != T_BLOCK) { 200*2865Speter ppnl(); 201*2865Speter indent(); 202*2865Speter } else { 203*2865Speter ppstbl2(); 204*2865Speter ppspac(); 205*2865Speter } 206*2865Speter s = r[4]; 207*2865Speter ppkw("else"); 208*2865Speter unprint(); 209*2865Speter ppspac(); 210*2865Speter if (s == NIL) 211*2865Speter goto burp; 212*2865Speter if (s[0] == T_BLOCK) 213*2865Speter ppstbl1(s, STAT); 214*2865Speter else if (s[0] == T_IF || s[0] == T_IFEL) 215*2865Speter ifop(s); 216*2865Speter else { 217*2865Speter burp: 218*2865Speter ppgoin(STAT); 219*2865Speter statement(s); 220*2865Speter ppgoout(STAT); 221*2865Speter } 222*2865Speter } 223*2865Speter if (rescnt(&scnt)) 224*2865Speter getcnt(); 225*2865Speter if (r[4] != NIL) 226*2865Speter unprint(); 227*2865Speter if (s != NIL && s[0] == T_BLOCK) 228*2865Speter ppstbl2(); 229*2865Speter } 230*2865Speter 231*2865Speter whilop(r) 232*2865Speter int *r; 233*2865Speter { 234*2865Speter struct pxcnt scnt; 235*2865Speter 236*2865Speter ppkw("while"); 237*2865Speter ppspac(); 238*2865Speter rvalue(r[2], NIL); 239*2865Speter savecnt(&scnt); 240*2865Speter getcnt(); 241*2865Speter ppstdo(r[3], STAT); 242*2865Speter if (rescnt(&scnt)) 243*2865Speter getcnt(); 244*2865Speter } 245*2865Speter 246*2865Speter repop(r) 247*2865Speter int *r; 248*2865Speter { 249*2865Speter struct pxcnt scnt; 250*2865Speter 251*2865Speter ppkw("repeat"); 252*2865Speter ppgoin(STAT); 253*2865Speter savecnt(&scnt); 254*2865Speter getcnt(); 255*2865Speter statlist(r[2]); 256*2865Speter ppgoout(DECL); 257*2865Speter ppnl(); 258*2865Speter indent(); 259*2865Speter ppkw("until"); 260*2865Speter ppspac(); 261*2865Speter rvalue(r[3], NIL); 262*2865Speter ppgoin(DECL); 263*2865Speter ppgoout(STAT); 264*2865Speter if (rescnt(&scnt)) 265*2865Speter getcnt(); 266*2865Speter } 267*2865Speter 268*2865Speter ppstbl(r, m) 269*2865Speter int *r; 270*2865Speter { 271*2865Speter ppstbl1(r, m); 272*2865Speter ppstbl2(); 273*2865Speter } 274*2865Speter 275*2865Speter ppstbl1(r, m) 276*2865Speter int *r; 277*2865Speter { 278*2865Speter ppkw("begin"); 279*2865Speter ppgoin(m); 280*2865Speter statlist(r[2]); 281*2865Speter ppgoout(m); 282*2865Speter } 283*2865Speter 284*2865Speter ppstbl2() 285*2865Speter { 286*2865Speter ppnl(); 287*2865Speter indent(); 288*2865Speter ppkw("end"); 289*2865Speter } 290*2865Speter 291*2865Speter ppstdo(r, l) 292*2865Speter int *r; 293*2865Speter { 294*2865Speter register *s; 295*2865Speter 296*2865Speter ppspac(); 297*2865Speter ppkw("do"); 298*2865Speter ppspac(); 299*2865Speter s = r; 300*2865Speter if (s != NIL && s[0] == T_BLOCK) 301*2865Speter ppstbl(s, l); 302*2865Speter else { 303*2865Speter ppgoin(l); 304*2865Speter statement(s); 305*2865Speter ppgoout(l); 306*2865Speter } 307*2865Speter } 308*2865Speter 309*2865Speter asrtop(s) 310*2865Speter int *s; 311*2865Speter { 312*2865Speter 313*2865Speter ppkw("assert"); 314*2865Speter ppspac(); 315*2865Speter rvalue(s[2], NIL); 316*2865Speter } 317