xref: /csrg-svn/usr.bin/pascal/pxp/case.c (revision 12410)
1*12410Speter static	char *sccsid = "@(#)case.c	1.2 (Berkeley) 05/12/83";
22850Speter /* Copyright (c) 1979 Regents of the University of California */
32850Speter #
42850Speter /*
52850Speter  * pxp - Pascal execution profiler
62850Speter  *
72850Speter  * Bill Joy UCB
82850Speter  * Version 1.2 January 1979
92850Speter  */
102850Speter 
112850Speter #include "0.h"
122850Speter #include "tree.h"
132850Speter 
142850Speter /*
152850Speter  * Case statement
16*12410Speter  *	r	[0]	T_CASE
17*12410Speter  *		[1]	lineof "case"
18*12410Speter  *		[2]	expression
19*12410Speter  *		[3]	list of cased statements:
20*12410Speter  *			cstat	[0]	T_CSTAT
21*12410Speter  *				[1]	lineof ":"
22*12410Speter  *				[2]	list of constant labels
23*12410Speter  *				[3]	statement
242850Speter  */
252850Speter caseop(r)
262850Speter 	int *r;
272850Speter {
282850Speter 	register *cl, *cs, i;
292850Speter 	struct pxcnt scnt;
30*12410Speter #	ifdef RMOTHERS
31*12410Speter 	    int *othersp;		/* tree where others is, or NIL */
32*12410Speter 	    int hasothers;		/* 1 if others found, else 0 */
33*12410Speter #	endif RMOTHERS
342850Speter 
35*12410Speter #	ifdef RMOTHERS
36*12410Speter 	    if (rmothers) {
37*12410Speter 		hasothers = needscaseguard(r,&othersp);
38*12410Speter 		if (hasothers) {
39*12410Speter 		    precaseguard(r);
40*12410Speter 		}
41*12410Speter 	    }
42*12410Speter #	endif RMOTHERS
432850Speter 	savecnt(&scnt);
442850Speter 	ppkw("case");
452850Speter 	ppspac();
462850Speter 	rvalue(r[2], NIL);
472850Speter 	ppspac();
482850Speter 	ppkw("of");
492850Speter 	for (cl = r[3]; cl != NIL;) {
502850Speter 		cs = cl[1];
512850Speter 		if (cs == NIL)
522850Speter 			continue;
532850Speter 		baroff();
542850Speter 		ppgoin(DECL);
552850Speter 		setline(cs[1]);
562850Speter 		ppnl();
572850Speter 		indent();
582850Speter 		ppbra(NIL);
592850Speter 		cs = cs[2];
602850Speter 		if (cs != NIL) {
612850Speter 			i = 0;
622850Speter 			for (;;) {
632850Speter 				gconst(cs[1]);
642850Speter 				cs = cs[2];
652850Speter 				if (cs == NIL)
662850Speter 					break;
672850Speter 				i++;
682850Speter 				if (i == 7) {
692850Speter 					ppsep(",");
702850Speter 					ppitem();
712850Speter 					i = 0;
722850Speter 				} else
732850Speter 					ppsep(", ");
742850Speter 			}
752850Speter 		} else
762850Speter 			ppid("{case label list}");
772850Speter 		ppket(":");
782850Speter 		cs = cl[1];
792850Speter 		cs = cs[3];
802850Speter 		getcnt();
812850Speter 		ppgoin(STAT);
822850Speter 		if (cs != NIL && cs[0] == T_BLOCK) {
832850Speter 			ppnl();
842850Speter 			indent();
852850Speter 			baron();
862850Speter 			ppstbl1(cs, STAT);
872850Speter 			baroff();
882850Speter 			ppstbl2();
892850Speter 			baron();
902850Speter 		} else {
912850Speter 			baron();
922850Speter 			statement(cs);
932850Speter 		}
942850Speter 		ppgoout(STAT);
952850Speter 		ppgoout(DECL);
962850Speter 		cl = cl[2];
972850Speter 		if (cl == NIL)
982850Speter 			break;
992850Speter 		ppsep(";");
1002850Speter 	}
1012850Speter 	if (rescnt(&scnt))
1022850Speter 		getcnt();
1032850Speter 	ppnl();
1042850Speter 	indent();
1052850Speter 	ppkw("end");
106*12410Speter #	ifdef RMOTHERS
107*12410Speter 	    if (rmothers) {
108*12410Speter 		if (hasothers) {
109*12410Speter 		    postcaseguard(othersp);
110*12410Speter 		}
111*12410Speter 	    }
112*12410Speter #	endif RMOTHERS
1132850Speter }
114