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