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