|
|
1.1 ! root 1: static char *sccsid = "@(#)case.c 1.2 (Berkeley) 5/12/83"; ! 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: /* ! 15: * Case statement ! 16: * r [0] T_CASE ! 17: * [1] lineof "case" ! 18: * [2] expression ! 19: * [3] list of cased statements: ! 20: * cstat [0] T_CSTAT ! 21: * [1] lineof ":" ! 22: * [2] list of constant labels ! 23: * [3] statement ! 24: */ ! 25: caseop(r) ! 26: int *r; ! 27: { ! 28: register *cl, *cs, i; ! 29: struct pxcnt scnt; ! 30: # ifdef RMOTHERS ! 31: int *othersp; /* tree where others is, or NIL */ ! 32: int hasothers; /* 1 if others found, else 0 */ ! 33: # endif RMOTHERS ! 34: ! 35: # ifdef RMOTHERS ! 36: if (rmothers) { ! 37: hasothers = needscaseguard(r,&othersp); ! 38: if (hasothers) { ! 39: precaseguard(r); ! 40: } ! 41: } ! 42: # endif RMOTHERS ! 43: savecnt(&scnt); ! 44: ppkw("case"); ! 45: ppspac(); ! 46: rvalue(r[2], NIL); ! 47: ppspac(); ! 48: ppkw("of"); ! 49: for (cl = r[3]; cl != NIL;) { ! 50: cs = cl[1]; ! 51: if (cs == NIL) ! 52: continue; ! 53: baroff(); ! 54: ppgoin(DECL); ! 55: setline(cs[1]); ! 56: ppnl(); ! 57: indent(); ! 58: ppbra(NIL); ! 59: cs = cs[2]; ! 60: if (cs != NIL) { ! 61: i = 0; ! 62: for (;;) { ! 63: gconst(cs[1]); ! 64: cs = cs[2]; ! 65: if (cs == NIL) ! 66: break; ! 67: i++; ! 68: if (i == 7) { ! 69: ppsep(","); ! 70: ppitem(); ! 71: i = 0; ! 72: } else ! 73: ppsep(", "); ! 74: } ! 75: } else ! 76: ppid("{case label list}"); ! 77: ppket(":"); ! 78: cs = cl[1]; ! 79: cs = cs[3]; ! 80: getcnt(); ! 81: ppgoin(STAT); ! 82: if (cs != NIL && cs[0] == T_BLOCK) { ! 83: ppnl(); ! 84: indent(); ! 85: baron(); ! 86: ppstbl1(cs, STAT); ! 87: baroff(); ! 88: ppstbl2(); ! 89: baron(); ! 90: } else { ! 91: baron(); ! 92: statement(cs); ! 93: } ! 94: ppgoout(STAT); ! 95: ppgoout(DECL); ! 96: cl = cl[2]; ! 97: if (cl == NIL) ! 98: break; ! 99: ppsep(";"); ! 100: } ! 101: if (rescnt(&scnt)) ! 102: getcnt(); ! 103: ppnl(); ! 104: indent(); ! 105: ppkw("end"); ! 106: # ifdef RMOTHERS ! 107: if (rmothers) { ! 108: if (hasothers) { ! 109: postcaseguard(othersp); ! 110: } ! 111: } ! 112: # endif RMOTHERS ! 113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.