1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)case.c 5.1 (Berkeley) 06/05/85"; 9 #endif not lint 10 11 /* 12 * pxp - Pascal execution profiler 13 * 14 * Bill Joy UCB 15 * Version 1.2 January 1979 16 */ 17 18 #include "0.h" 19 #include "tree.h" 20 21 /* 22 * Case statement 23 * r [0] T_CASE 24 * [1] lineof "case" 25 * [2] expression 26 * [3] list of cased statements: 27 * cstat [0] T_CSTAT 28 * [1] lineof ":" 29 * [2] list of constant labels 30 * [3] statement 31 */ 32 caseop(r) 33 int *r; 34 { 35 register *cl, *cs, i; 36 struct pxcnt scnt; 37 # ifdef RMOTHERS 38 int *othersp; /* tree where others is, or NIL */ 39 int hasothers; /* 1 if others found, else 0 */ 40 # endif RMOTHERS 41 42 # ifdef RMOTHERS 43 if (rmothers) { 44 hasothers = needscaseguard(r,&othersp); 45 if (hasothers) { 46 precaseguard(r); 47 } 48 } 49 # endif RMOTHERS 50 savecnt(&scnt); 51 ppkw("case"); 52 ppspac(); 53 rvalue(r[2], NIL); 54 ppspac(); 55 ppkw("of"); 56 for (cl = r[3]; cl != NIL;) { 57 cs = cl[1]; 58 if (cs == NIL) 59 continue; 60 baroff(); 61 ppgoin(DECL); 62 setline(cs[1]); 63 ppnl(); 64 indent(); 65 ppbra(NIL); 66 cs = cs[2]; 67 if (cs != NIL) { 68 i = 0; 69 for (;;) { 70 gconst(cs[1]); 71 cs = cs[2]; 72 if (cs == NIL) 73 break; 74 i++; 75 if (i == 7) { 76 ppsep(","); 77 ppitem(); 78 i = 0; 79 } else 80 ppsep(", "); 81 } 82 } else 83 ppid("{case label list}"); 84 ppket(":"); 85 cs = cl[1]; 86 cs = cs[3]; 87 getcnt(); 88 ppgoin(STAT); 89 if (cs != NIL && cs[0] == T_BLOCK) { 90 ppnl(); 91 indent(); 92 baron(); 93 ppstbl1(cs, STAT); 94 baroff(); 95 ppstbl2(); 96 baron(); 97 } else { 98 baron(); 99 statement(cs); 100 } 101 ppgoout(STAT); 102 ppgoout(DECL); 103 cl = cl[2]; 104 if (cl == NIL) 105 break; 106 ppsep(";"); 107 } 108 if (rescnt(&scnt)) 109 getcnt(); 110 ppnl(); 111 indent(); 112 ppkw("end"); 113 # ifdef RMOTHERS 114 if (rmothers) { 115 if (hasothers) { 116 postcaseguard(othersp); 117 } 118 } 119 # endif RMOTHERS 120 } 121