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