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