xref: /csrg-svn/usr.bin/pascal/pxp/case.c (revision 62189)
148112Sbostic /*-
2*62189Sbostic  * Copyright (c) 1980, 1993
3*62189Sbostic  *	The Regents of the University of California.  All rights reserved.
448112Sbostic  *
548112Sbostic  * %sccs.include.redist.c%
622224Sdist  */
722224Sdist 
822224Sdist #ifndef lint
9*62189Sbostic static char sccsid[] = "@(#)case.c	8.1 (Berkeley) 06/06/93";
1048112Sbostic #endif /* not lint */
1122224Sdist 
1222224Sdist /*
132850Speter  * pxp - Pascal execution profiler
142850Speter  *
152850Speter  * Bill Joy UCB
162850Speter  * Version 1.2 January 1979
172850Speter  */
182850Speter 
192850Speter #include "0.h"
202850Speter #include "tree.h"
212850Speter 
222850Speter /*
232850Speter  * Case statement
2412410Speter  *	r	[0]	T_CASE
2512410Speter  *		[1]	lineof "case"
2612410Speter  *		[2]	expression
2712410Speter  *		[3]	list of cased statements:
2812410Speter  *			cstat	[0]	T_CSTAT
2912410Speter  *				[1]	lineof ":"
3012410Speter  *				[2]	list of constant labels
3112410Speter  *				[3]	statement
322850Speter  */
caseop(r)332850Speter caseop(r)
342850Speter 	int *r;
352850Speter {
362850Speter 	register *cl, *cs, i;
372850Speter 	struct pxcnt scnt;
3812410Speter #	ifdef RMOTHERS
3912410Speter 	    int *othersp;		/* tree where others is, or NIL */
4012410Speter 	    int hasothers;		/* 1 if others found, else 0 */
4112410Speter #	endif RMOTHERS
422850Speter 
4312410Speter #	ifdef RMOTHERS
4412410Speter 	    if (rmothers) {
4512410Speter 		hasothers = needscaseguard(r,&othersp);
4612410Speter 		if (hasothers) {
4712410Speter 		    precaseguard(r);
4812410Speter 		}
4912410Speter 	    }
5012410Speter #	endif RMOTHERS
512850Speter 	savecnt(&scnt);
522850Speter 	ppkw("case");
532850Speter 	ppspac();
542850Speter 	rvalue(r[2], NIL);
552850Speter 	ppspac();
562850Speter 	ppkw("of");
572850Speter 	for (cl = r[3]; cl != NIL;) {
582850Speter 		cs = cl[1];
592850Speter 		if (cs == NIL)
602850Speter 			continue;
612850Speter 		baroff();
622850Speter 		ppgoin(DECL);
632850Speter 		setline(cs[1]);
642850Speter 		ppnl();
652850Speter 		indent();
662850Speter 		ppbra(NIL);
672850Speter 		cs = cs[2];
682850Speter 		if (cs != NIL) {
692850Speter 			i = 0;
702850Speter 			for (;;) {
712850Speter 				gconst(cs[1]);
722850Speter 				cs = cs[2];
732850Speter 				if (cs == NIL)
742850Speter 					break;
752850Speter 				i++;
762850Speter 				if (i == 7) {
772850Speter 					ppsep(",");
782850Speter 					ppitem();
792850Speter 					i = 0;
802850Speter 				} else
812850Speter 					ppsep(", ");
822850Speter 			}
832850Speter 		} else
842850Speter 			ppid("{case label list}");
852850Speter 		ppket(":");
862850Speter 		cs = cl[1];
872850Speter 		cs = cs[3];
882850Speter 		getcnt();
892850Speter 		ppgoin(STAT);
902850Speter 		if (cs != NIL && cs[0] == T_BLOCK) {
912850Speter 			ppnl();
922850Speter 			indent();
932850Speter 			baron();
942850Speter 			ppstbl1(cs, STAT);
952850Speter 			baroff();
962850Speter 			ppstbl2();
972850Speter 			baron();
982850Speter 		} else {
992850Speter 			baron();
1002850Speter 			statement(cs);
1012850Speter 		}
1022850Speter 		ppgoout(STAT);
1032850Speter 		ppgoout(DECL);
1042850Speter 		cl = cl[2];
1052850Speter 		if (cl == NIL)
1062850Speter 			break;
1072850Speter 		ppsep(";");
1082850Speter 	}
1092850Speter 	if (rescnt(&scnt))
1102850Speter 		getcnt();
1112850Speter 	ppnl();
1122850Speter 	indent();
1132850Speter 	ppkw("end");
11412410Speter #	ifdef RMOTHERS
11512410Speter 	    if (rmothers) {
11612410Speter 		if (hasothers) {
11712410Speter 		    postcaseguard(othersp);
11812410Speter 		}
11912410Speter 	    }
12012410Speter #	endif RMOTHERS
1212850Speter }
122