xref: /csrg-svn/usr.bin/pascal/pxp/case.c (revision 2850)
1*2850Speter static	char *sccsid = "@(#)case.c	1.1 (Berkeley) 03/02/81";
2*2850Speter /* Copyright (c) 1979 Regents of the University of California */
3*2850Speter #
4*2850Speter /*
5*2850Speter  * pxp - Pascal execution profiler
6*2850Speter  *
7*2850Speter  * Bill Joy UCB
8*2850Speter  * Version 1.2 January 1979
9*2850Speter  */
10*2850Speter 
11*2850Speter #include "0.h"
12*2850Speter #include "tree.h"
13*2850Speter 
14*2850Speter /*
15*2850Speter  * Case statement
16*2850Speter  */
17*2850Speter caseop(r)
18*2850Speter 	int *r;
19*2850Speter {
20*2850Speter 	register *cl, *cs, i;
21*2850Speter 	struct pxcnt scnt;
22*2850Speter 
23*2850Speter 	savecnt(&scnt);
24*2850Speter 	ppkw("case");
25*2850Speter 	ppspac();
26*2850Speter 	rvalue(r[2], NIL);
27*2850Speter 	ppspac();
28*2850Speter 	ppkw("of");
29*2850Speter 	for (cl = r[3]; cl != NIL;) {
30*2850Speter 		cs = cl[1];
31*2850Speter 		if (cs == NIL)
32*2850Speter 			continue;
33*2850Speter 		baroff();
34*2850Speter 		ppgoin(DECL);
35*2850Speter 		setline(cs[1]);
36*2850Speter 		ppnl();
37*2850Speter 		indent();
38*2850Speter 		ppbra(NIL);
39*2850Speter 		cs = cs[2];
40*2850Speter 		if (cs != NIL) {
41*2850Speter 			i = 0;
42*2850Speter 			for (;;) {
43*2850Speter 				gconst(cs[1]);
44*2850Speter 				cs = cs[2];
45*2850Speter 				if (cs == NIL)
46*2850Speter 					break;
47*2850Speter 				i++;
48*2850Speter 				if (i == 7) {
49*2850Speter 					ppsep(",");
50*2850Speter 					ppitem();
51*2850Speter 					i = 0;
52*2850Speter 				} else
53*2850Speter 					ppsep(", ");
54*2850Speter 			}
55*2850Speter 		} else
56*2850Speter 			ppid("{case label list}");
57*2850Speter 		ppket(":");
58*2850Speter 		cs = cl[1];
59*2850Speter 		cs = cs[3];
60*2850Speter 		getcnt();
61*2850Speter 		ppgoin(STAT);
62*2850Speter 		if (cs != NIL && cs[0] == T_BLOCK) {
63*2850Speter 			ppnl();
64*2850Speter 			indent();
65*2850Speter 			baron();
66*2850Speter 			ppstbl1(cs, STAT);
67*2850Speter 			baroff();
68*2850Speter 			ppstbl2();
69*2850Speter 			baron();
70*2850Speter 		} else {
71*2850Speter 			baron();
72*2850Speter 			statement(cs);
73*2850Speter 		}
74*2850Speter 		ppgoout(STAT);
75*2850Speter 		ppgoout(DECL);
76*2850Speter 		cl = cl[2];
77*2850Speter 		if (cl == NIL)
78*2850Speter 			break;
79*2850Speter 		ppsep(";");
80*2850Speter 	}
81*2850Speter 	if (rescnt(&scnt))
82*2850Speter 		getcnt();
83*2850Speter 	ppnl();
84*2850Speter 	indent();
85*2850Speter 	ppkw("end");
86*2850Speter }
87