xref: /csrg-svn/old/ratfor/r0.c (revision 14502)
1 #ifndef lint
2 static char sccsid[] = "@(#)r0.c	1.2 (Berkeley) 08/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 }
88