1*48112Sbostic /*- 2*48112Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48112Sbostic * All rights reserved. 4*48112Sbostic * 5*48112Sbostic * %sccs.include.redist.c% 622224Sdist */ 722224Sdist 822224Sdist #ifndef lint 9*48112Sbostic static char sccsid[] = "@(#)case.c 5.2 (Berkeley) 04/16/91"; 10*48112Sbostic #endif /* not lint */ 1122224Sdist 1222224Sdist /* 132850Speter * pxp - Pascal execution profiler 142850Speter * 152850Speter * Bill Joy UCB 162850Speter * Version 1.2 January 1979 172850Speter */ 182850Speter 192850Speter #include "0.h" 202850Speter #include "tree.h" 212850Speter 222850Speter /* 232850Speter * Case statement 2412410Speter * r [0] T_CASE 2512410Speter * [1] lineof "case" 2612410Speter * [2] expression 2712410Speter * [3] list of cased statements: 2812410Speter * cstat [0] T_CSTAT 2912410Speter * [1] lineof ":" 3012410Speter * [2] list of constant labels 3112410Speter * [3] statement 322850Speter */ 332850Speter caseop(r) 342850Speter int *r; 352850Speter { 362850Speter register *cl, *cs, i; 372850Speter struct pxcnt scnt; 3812410Speter # ifdef RMOTHERS 3912410Speter int *othersp; /* tree where others is, or NIL */ 4012410Speter int hasothers; /* 1 if others found, else 0 */ 4112410Speter # endif RMOTHERS 422850Speter 4312410Speter # ifdef RMOTHERS 4412410Speter if (rmothers) { 4512410Speter hasothers = needscaseguard(r,&othersp); 4612410Speter if (hasothers) { 4712410Speter precaseguard(r); 4812410Speter } 4912410Speter } 5012410Speter # endif RMOTHERS 512850Speter savecnt(&scnt); 522850Speter ppkw("case"); 532850Speter ppspac(); 542850Speter rvalue(r[2], NIL); 552850Speter ppspac(); 562850Speter ppkw("of"); 572850Speter for (cl = r[3]; cl != NIL;) { 582850Speter cs = cl[1]; 592850Speter if (cs == NIL) 602850Speter continue; 612850Speter baroff(); 622850Speter ppgoin(DECL); 632850Speter setline(cs[1]); 642850Speter ppnl(); 652850Speter indent(); 662850Speter ppbra(NIL); 672850Speter cs = cs[2]; 682850Speter if (cs != NIL) { 692850Speter i = 0; 702850Speter for (;;) { 712850Speter gconst(cs[1]); 722850Speter cs = cs[2]; 732850Speter if (cs == NIL) 742850Speter break; 752850Speter i++; 762850Speter if (i == 7) { 772850Speter ppsep(","); 782850Speter ppitem(); 792850Speter i = 0; 802850Speter } else 812850Speter ppsep(", "); 822850Speter } 832850Speter } else 842850Speter ppid("{case label list}"); 852850Speter ppket(":"); 862850Speter cs = cl[1]; 872850Speter cs = cs[3]; 882850Speter getcnt(); 892850Speter ppgoin(STAT); 902850Speter if (cs != NIL && cs[0] == T_BLOCK) { 912850Speter ppnl(); 922850Speter indent(); 932850Speter baron(); 942850Speter ppstbl1(cs, STAT); 952850Speter baroff(); 962850Speter ppstbl2(); 972850Speter baron(); 982850Speter } else { 992850Speter baron(); 1002850Speter statement(cs); 1012850Speter } 1022850Speter ppgoout(STAT); 1032850Speter ppgoout(DECL); 1042850Speter cl = cl[2]; 1052850Speter if (cl == NIL) 1062850Speter break; 1072850Speter ppsep(";"); 1082850Speter } 1092850Speter if (rescnt(&scnt)) 1102850Speter getcnt(); 1112850Speter ppnl(); 1122850Speter indent(); 1132850Speter ppkw("end"); 11412410Speter # ifdef RMOTHERS 11512410Speter if (rmothers) { 11612410Speter if (hasothers) { 11712410Speter postcaseguard(othersp); 11812410Speter } 11912410Speter } 12012410Speter # endif RMOTHERS 1212850Speter } 122