xref: /csrg-svn/usr.bin/pascal/pxp/lval.c (revision 2857)
1*2857Speter static	char *sccsid = "@(#)lval.c	1.1 (Berkeley) 03/02/81";
2*2857Speter /* Copyright (c) 1979 Regents of the University of California */
3*2857Speter #
4*2857Speter /*
5*2857Speter  * pxp - Pascal execution profiler
6*2857Speter  *
7*2857Speter  * Bill Joy UCB
8*2857Speter  * Version 1.2 January 1979
9*2857Speter  */
10*2857Speter 
11*2857Speter #include "0.h"
12*2857Speter #include "tree.h"
13*2857Speter 
14*2857Speter /*
15*2857Speter  * A "variable"
16*2857Speter  */
17*2857Speter lvalue(r)
18*2857Speter 	register int *r;
19*2857Speter {
20*2857Speter 	register *c, *co;
21*2857Speter 
22*2857Speter 	ppid(r[2]);
23*2857Speter 	for (c = r[3]; c != NIL; c = c[2]) {
24*2857Speter 		co = c[1];
25*2857Speter 		if (co == NIL)
26*2857Speter 			continue;
27*2857Speter 		switch (co[0]) {
28*2857Speter 			case T_PTR:
29*2857Speter 				ppop("^");
30*2857Speter 				continue;
31*2857Speter 			case T_ARY:
32*2857Speter 				arycod(co[1]);
33*2857Speter 				continue;
34*2857Speter 			case T_FIELD:
35*2857Speter 				ppop(".");
36*2857Speter 				ppid(co[1]);
37*2857Speter 				continue;
38*2857Speter 			case T_ARGL:
39*2857Speter 				ppid("{unexpected argument list}");
40*2857Speter 				break;
41*2857Speter 			default:
42*2857Speter 				panic("lval2");
43*2857Speter 		}
44*2857Speter 	}
45*2857Speter }
46*2857Speter 
47*2857Speter /*
48*2857Speter  * Subscripting
49*2857Speter  */
50*2857Speter arycod(el)
51*2857Speter 	register int *el;
52*2857Speter {
53*2857Speter 
54*2857Speter 	ppbra("[");
55*2857Speter 	if (el != NIL)
56*2857Speter 		for (;;) {
57*2857Speter 			rvalue(el[1], NIL);
58*2857Speter 			el = el[2];
59*2857Speter 			if (el == NIL)
60*2857Speter 				break;
61*2857Speter 			ppsep(", ");
62*2857Speter 		}
63*2857Speter 	else
64*2857Speter 		rvalue(NIL, NIL);
65*2857Speter 	ppket("]");
66*2857Speter }
67