xref: /csrg-svn/old/ratfor/r0.c (revision 14502)
1*14502Ssam #ifndef lint
2*14502Ssam static char sccsid[] = "@(#)r0.c	1.2 (Berkeley) 08/11/83";
3*14502Ssam #endif
4*14502Ssam 
59725Sclemc #include "r.h"
69725Sclemc 
79725Sclemc int	swlevel	= -1;
89725Sclemc int	swexit[5];
99725Sclemc int	nextcase[5];
109725Sclemc 
119725Sclemc swcode() {
129725Sclemc 	transfer = 0;
139725Sclemc 	putcom("switch");
149725Sclemc 	swlevel++;
159725Sclemc 	if (swlevel >= 5)
169725Sclemc 		error("Switches nested > 5");
179725Sclemc 	swexit[swlevel] = yyval = genlab(1);
189725Sclemc 	outcode("\tI");
199725Sclemc 	outnum(yyval);
209725Sclemc 	outcode(" = ");
219725Sclemc 	balpar();
229725Sclemc 	outdon();
239725Sclemc 	nextcase[swlevel] = 0;
249725Sclemc 	indent++;
259725Sclemc }
269725Sclemc 
279725Sclemc getcase() {
289725Sclemc 	int t, lpar;
299725Sclemc 	char token[100];
309725Sclemc 
319725Sclemc 	if (nextcase[swlevel] != 0) {
329725Sclemc 		outgoto(swexit[swlevel]);
339725Sclemc 		outcont(nextcase[swlevel]);
349725Sclemc 	}
359725Sclemc 	indent--;
369725Sclemc 	outcode("\tif(.not.(");
379725Sclemc 	do {
389725Sclemc 		outcode("I");
399725Sclemc 		outnum(swexit[swlevel]);
409725Sclemc 		outcode(".eq.(");
419725Sclemc 		lpar = 0;
429725Sclemc 		do {
439725Sclemc 			if ((t=gtok(token)) == ':')
449725Sclemc 				break;
459725Sclemc 			if (t == '(')
469725Sclemc 				lpar++;
479725Sclemc 			else if (t == ')')
489725Sclemc 				lpar--;
499725Sclemc 			else if (t == ',') {
509725Sclemc 				if (lpar == 0)
519725Sclemc 					break;
529725Sclemc 				}
539725Sclemc 			outcode(token);
549725Sclemc 		} while (lpar >= 0);
559725Sclemc 		if (lpar < 0)
569725Sclemc 			error("Missing left parenthesis in case");
579725Sclemc 		if (t == ',')
589725Sclemc 			outcode(").or.");
599725Sclemc 	} while (t != ':');
609725Sclemc 	if (lpar != 0)
619725Sclemc 		error("Missing parenthesis in case");
629725Sclemc 	outcode(")))");
639725Sclemc 	nextcase[swlevel] = genlab(1);
649725Sclemc 	outgoto(nextcase[swlevel]);
659725Sclemc 	indent++;
669725Sclemc }
679725Sclemc 
689725Sclemc getdefault() {
699725Sclemc 	char token[20];
709725Sclemc 	if (gnbtok(token) != ':')
719725Sclemc 		error("Missing colon after default");
729725Sclemc 	outgoto(swexit[swlevel]);
739725Sclemc 	outcont(nextcase[swlevel]);
749725Sclemc 	indent--;
759725Sclemc 	putcom("default");
769725Sclemc 	indent++;
779725Sclemc }
789725Sclemc 
799725Sclemc endsw(n, def) {
809725Sclemc 	if (def == 0)
819725Sclemc 		outcont(nextcase[swlevel]);
829725Sclemc 	swlevel--;
839725Sclemc 	if (swlevel < -1)
849725Sclemc 		error("Switches unwound too far");
859725Sclemc 	indent--;
869725Sclemc 	outcont(n);
879725Sclemc }
88