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