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