xref: /original-bsd/old/ratfor/r0.c (revision f0fd5f8a)
1 /* @(#)r0.c	1.1 (Berkeley) 12/15/82 */
2 #include "r.h"
3 
4 int	swlevel	= -1;
5 int	swexit[5];
6 int	nextcase[5];
7 
8 swcode() {
9 	transfer = 0;
10 	putcom("switch");
11 	swlevel++;
12 	if (swlevel >= 5)
13 		error("Switches nested > 5");
14 	swexit[swlevel] = yyval = genlab(1);
15 	outcode("\tI");
16 	outnum(yyval);
17 	outcode(" = ");
18 	balpar();
19 	outdon();
20 	nextcase[swlevel] = 0;
21 	indent++;
22 }
23 
24 getcase() {
25 	int t, lpar;
26 	char token[100];
27 
28 	if (nextcase[swlevel] != 0) {
29 		outgoto(swexit[swlevel]);
30 		outcont(nextcase[swlevel]);
31 	}
32 	indent--;
33 	outcode("\tif(.not.(");
34 	do {
35 		outcode("I");
36 		outnum(swexit[swlevel]);
37 		outcode(".eq.(");
38 		lpar = 0;
39 		do {
40 			if ((t=gtok(token)) == ':')
41 				break;
42 			if (t == '(')
43 				lpar++;
44 			else if (t == ')')
45 				lpar--;
46 			else if (t == ',') {
47 				if (lpar == 0)
48 					break;
49 				}
50 			outcode(token);
51 		} while (lpar >= 0);
52 		if (lpar < 0)
53 			error("Missing left parenthesis in case");
54 		if (t == ',')
55 			outcode(").or.");
56 	} while (t != ':');
57 	if (lpar != 0)
58 		error("Missing parenthesis in case");
59 	outcode(")))");
60 	nextcase[swlevel] = genlab(1);
61 	outgoto(nextcase[swlevel]);
62 	indent++;
63 }
64 
65 getdefault() {
66 	char token[20];
67 	if (gnbtok(token) != ':')
68 		error("Missing colon after default");
69 	outgoto(swexit[swlevel]);
70 	outcont(nextcase[swlevel]);
71 	indent--;
72 	putcom("default");
73 	indent++;
74 }
75 
76 endsw(n, def) {
77 	if (def == 0)
78 		outcont(nextcase[swlevel]);
79 	swlevel--;
80 	if (swlevel < -1)
81 		error("Switches unwound too far");
82 	indent--;
83 	outcont(n);
84 }
85