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