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