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