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