1*12410Speter static char *sccsid = "@(#)case.c 1.2 (Berkeley) 05/12/83"; 22850Speter /* Copyright (c) 1979 Regents of the University of California */ 32850Speter # 42850Speter /* 52850Speter * pxp - Pascal execution profiler 62850Speter * 72850Speter * Bill Joy UCB 82850Speter * Version 1.2 January 1979 92850Speter */ 102850Speter 112850Speter #include "0.h" 122850Speter #include "tree.h" 132850Speter 142850Speter /* 152850Speter * Case statement 16*12410Speter * r [0] T_CASE 17*12410Speter * [1] lineof "case" 18*12410Speter * [2] expression 19*12410Speter * [3] list of cased statements: 20*12410Speter * cstat [0] T_CSTAT 21*12410Speter * [1] lineof ":" 22*12410Speter * [2] list of constant labels 23*12410Speter * [3] statement 242850Speter */ 252850Speter caseop(r) 262850Speter int *r; 272850Speter { 282850Speter register *cl, *cs, i; 292850Speter struct pxcnt scnt; 30*12410Speter # ifdef RMOTHERS 31*12410Speter int *othersp; /* tree where others is, or NIL */ 32*12410Speter int hasothers; /* 1 if others found, else 0 */ 33*12410Speter # endif RMOTHERS 342850Speter 35*12410Speter # ifdef RMOTHERS 36*12410Speter if (rmothers) { 37*12410Speter hasothers = needscaseguard(r,&othersp); 38*12410Speter if (hasothers) { 39*12410Speter precaseguard(r); 40*12410Speter } 41*12410Speter } 42*12410Speter # endif RMOTHERS 432850Speter savecnt(&scnt); 442850Speter ppkw("case"); 452850Speter ppspac(); 462850Speter rvalue(r[2], NIL); 472850Speter ppspac(); 482850Speter ppkw("of"); 492850Speter for (cl = r[3]; cl != NIL;) { 502850Speter cs = cl[1]; 512850Speter if (cs == NIL) 522850Speter continue; 532850Speter baroff(); 542850Speter ppgoin(DECL); 552850Speter setline(cs[1]); 562850Speter ppnl(); 572850Speter indent(); 582850Speter ppbra(NIL); 592850Speter cs = cs[2]; 602850Speter if (cs != NIL) { 612850Speter i = 0; 622850Speter for (;;) { 632850Speter gconst(cs[1]); 642850Speter cs = cs[2]; 652850Speter if (cs == NIL) 662850Speter break; 672850Speter i++; 682850Speter if (i == 7) { 692850Speter ppsep(","); 702850Speter ppitem(); 712850Speter i = 0; 722850Speter } else 732850Speter ppsep(", "); 742850Speter } 752850Speter } else 762850Speter ppid("{case label list}"); 772850Speter ppket(":"); 782850Speter cs = cl[1]; 792850Speter cs = cs[3]; 802850Speter getcnt(); 812850Speter ppgoin(STAT); 822850Speter if (cs != NIL && cs[0] == T_BLOCK) { 832850Speter ppnl(); 842850Speter indent(); 852850Speter baron(); 862850Speter ppstbl1(cs, STAT); 872850Speter baroff(); 882850Speter ppstbl2(); 892850Speter baron(); 902850Speter } else { 912850Speter baron(); 922850Speter statement(cs); 932850Speter } 942850Speter ppgoout(STAT); 952850Speter ppgoout(DECL); 962850Speter cl = cl[2]; 972850Speter if (cl == NIL) 982850Speter break; 992850Speter ppsep(";"); 1002850Speter } 1012850Speter if (rescnt(&scnt)) 1022850Speter getcnt(); 1032850Speter ppnl(); 1042850Speter indent(); 1052850Speter ppkw("end"); 106*12410Speter # ifdef RMOTHERS 107*12410Speter if (rmothers) { 108*12410Speter if (hasothers) { 109*12410Speter postcaseguard(othersp); 110*12410Speter } 111*12410Speter } 112*12410Speter # endif RMOTHERS 1132850Speter } 114