xref: /csrg-svn/old/ratfor/r0.c (revision 9725)
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