1*14502Ssam #ifndef lint 2*14502Ssam static char sccsid[] = "@(#)r0.c 1.2 (Berkeley) 08/11/83"; 3*14502Ssam #endif 4*14502Ssam 59725Sclemc #include "r.h" 69725Sclemc 79725Sclemc int swlevel = -1; 89725Sclemc int swexit[5]; 99725Sclemc int nextcase[5]; 109725Sclemc 119725Sclemc swcode() { 129725Sclemc transfer = 0; 139725Sclemc putcom("switch"); 149725Sclemc swlevel++; 159725Sclemc if (swlevel >= 5) 169725Sclemc error("Switches nested > 5"); 179725Sclemc swexit[swlevel] = yyval = genlab(1); 189725Sclemc outcode("\tI"); 199725Sclemc outnum(yyval); 209725Sclemc outcode(" = "); 219725Sclemc balpar(); 229725Sclemc outdon(); 239725Sclemc nextcase[swlevel] = 0; 249725Sclemc indent++; 259725Sclemc } 269725Sclemc 279725Sclemc getcase() { 289725Sclemc int t, lpar; 299725Sclemc char token[100]; 309725Sclemc 319725Sclemc if (nextcase[swlevel] != 0) { 329725Sclemc outgoto(swexit[swlevel]); 339725Sclemc outcont(nextcase[swlevel]); 349725Sclemc } 359725Sclemc indent--; 369725Sclemc outcode("\tif(.not.("); 379725Sclemc do { 389725Sclemc outcode("I"); 399725Sclemc outnum(swexit[swlevel]); 409725Sclemc outcode(".eq.("); 419725Sclemc lpar = 0; 429725Sclemc do { 439725Sclemc if ((t=gtok(token)) == ':') 449725Sclemc break; 459725Sclemc if (t == '(') 469725Sclemc lpar++; 479725Sclemc else if (t == ')') 489725Sclemc lpar--; 499725Sclemc else if (t == ',') { 509725Sclemc if (lpar == 0) 519725Sclemc break; 529725Sclemc } 539725Sclemc outcode(token); 549725Sclemc } while (lpar >= 0); 559725Sclemc if (lpar < 0) 569725Sclemc error("Missing left parenthesis in case"); 579725Sclemc if (t == ',') 589725Sclemc outcode(").or."); 599725Sclemc } while (t != ':'); 609725Sclemc if (lpar != 0) 619725Sclemc error("Missing parenthesis in case"); 629725Sclemc outcode(")))"); 639725Sclemc nextcase[swlevel] = genlab(1); 649725Sclemc outgoto(nextcase[swlevel]); 659725Sclemc indent++; 669725Sclemc } 679725Sclemc 689725Sclemc getdefault() { 699725Sclemc char token[20]; 709725Sclemc if (gnbtok(token) != ':') 719725Sclemc error("Missing colon after default"); 729725Sclemc outgoto(swexit[swlevel]); 739725Sclemc outcont(nextcase[swlevel]); 749725Sclemc indent--; 759725Sclemc putcom("default"); 769725Sclemc indent++; 779725Sclemc } 789725Sclemc 799725Sclemc endsw(n, def) { 809725Sclemc if (def == 0) 819725Sclemc outcont(nextcase[swlevel]); 829725Sclemc swlevel--; 839725Sclemc if (swlevel < -1) 849725Sclemc error("Switches unwound too far"); 859725Sclemc indent--; 869725Sclemc outcont(n); 879725Sclemc } 88