1: #ifndef lint 2: static char sccsid[] = "@(#)r0.c 1.2 (Berkeley) 8/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: }