1 /* @(#)r0.c 1.1 (Berkeley) 12/15/82 */ 2 #include "r.h" 3 4 int swlevel = -1; 5 int swexit[5]; 6 int nextcase[5]; 7 8 swcode() { 9 transfer = 0; 10 putcom("switch"); 11 swlevel++; 12 if (swlevel >= 5) 13 error("Switches nested > 5"); 14 swexit[swlevel] = yyval = genlab(1); 15 outcode("\tI"); 16 outnum(yyval); 17 outcode(" = "); 18 balpar(); 19 outdon(); 20 nextcase[swlevel] = 0; 21 indent++; 22 } 23 24 getcase() { 25 int t, lpar; 26 char token[100]; 27 28 if (nextcase[swlevel] != 0) { 29 outgoto(swexit[swlevel]); 30 outcont(nextcase[swlevel]); 31 } 32 indent--; 33 outcode("\tif(.not.("); 34 do { 35 outcode("I"); 36 outnum(swexit[swlevel]); 37 outcode(".eq.("); 38 lpar = 0; 39 do { 40 if ((t=gtok(token)) == ':') 41 break; 42 if (t == '(') 43 lpar++; 44 else if (t == ')') 45 lpar--; 46 else if (t == ',') { 47 if (lpar == 0) 48 break; 49 } 50 outcode(token); 51 } while (lpar >= 0); 52 if (lpar < 0) 53 error("Missing left parenthesis in case"); 54 if (t == ',') 55 outcode(").or."); 56 } while (t != ':'); 57 if (lpar != 0) 58 error("Missing parenthesis in case"); 59 outcode(")))"); 60 nextcase[swlevel] = genlab(1); 61 outgoto(nextcase[swlevel]); 62 indent++; 63 } 64 65 getdefault() { 66 char token[20]; 67 if (gnbtok(token) != ':') 68 error("Missing colon after default"); 69 outgoto(swexit[swlevel]); 70 outcont(nextcase[swlevel]); 71 indent--; 72 putcom("default"); 73 indent++; 74 } 75 76 endsw(n, def) { 77 if (def == 0) 78 outcont(nextcase[swlevel]); 79 swlevel--; 80 if (swlevel < -1) 81 error("Switches unwound too far"); 82 indent--; 83 outcont(n); 84 } 85