1 /*-
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)print.c 8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11
12 /*
13 * Routines to print out symbols.
14 */
15
16 #include "defs.h"
17 #include "sym.h"
18 #include "process.h"
19 #include "tree.h"
20 #include "runtime.h"
21 #include "classes.h"
22 #include "sym.rep"
23 #include "process/process.rep"
24
25 /*
26 * Note the entry of the given block, unless it's the main program.
27 */
28
printentry(s)29 printentry(s)
30 SYM *s;
31 {
32 if (s != program) {
33 printf("\nentering %s %s\n", classname(s), s->symbol);
34 }
35 }
36
37 /*
38 * Note the exit of the given block
39 */
40
printexit(s)41 printexit(s)
42 SYM *s;
43 {
44 if (s != program) {
45 printf("leaving %s %s\n\n", classname(s), s->symbol);
46 }
47 }
48
49 /*
50 * Note the call of s from t.
51 */
52
printcall(s,t)53 printcall(s, t)
54 SYM *s, *t;
55 {
56 printf("calling %s", s->symbol);
57 printparams(s, NIL);
58 printf(" from %s %s\n", classname(t), t->symbol);
59 }
60
61 /*
62 * Note the return from s. If s is a function, print the value
63 * it is returning. This is somewhat painful, since the function
64 * has actually just returned.
65 */
66
printrtn(s)67 printrtn(s)
68 SYM *s;
69 {
70 register int len;
71
72 printf("returning ");
73 if (s->class == FUNC) {
74 len = size(s->type);
75 dread(sp, process->sp, len);
76 sp += len;
77 #ifdef tahoe
78 alignstack();
79 #endif
80 printval(s->type);
81 putchar(' ');
82 }
83 printf("from %s\n", s->symbol);
84 }
85
86 /*
87 * Print the values of the parameters of the given procedure or function.
88 * The frame distinguishes recursive instances of a procedure.
89 */
90
printparams(f,frame)91 printparams(f, frame)
92 SYM *f;
93 FRAME *frame;
94 {
95 SYM *param;
96
97 for (param = f->chain; param != NIL; param = param->chain) {
98 if (param == f->chain) {
99 printf("(");
100 }
101 printv(param, frame);
102 if (param->chain != NIL) {
103 printf(", ");
104 } else {
105 printf(")");
106 }
107 }
108 }
109
110 /*
111 * Print the name and value of a variable.
112 */
113
printv(s,frame)114 printv(s, frame)
115 SYM *s;
116 FRAME *frame;
117 {
118 ADDRESS addr;
119 int len;
120
121 if (s->class == REF) {
122 dread(&addr, address(s, frame), sizeof(ADDRESS));
123 len = size(s->type);
124 } else {
125 addr = address(s, frame);
126 len = size(s);
127 }
128 printf("%s = ", s->symbol);
129 if (!rpush(addr, len)) {
130 printf("*** expression too large ***");
131 } else {
132 if (s->class == REF || s->class == VAR) {
133 printval(s->type);
134 } else {
135 printval(s);
136 }
137 }
138 }
139
140 /*
141 * Print the fully specified variable that is described by the given identifer.
142 */
143
printwhich(s)144 printwhich(s)
145 SYM *s;
146 {
147 printouter(s->func);
148 printf("%s", s->symbol);
149 }
150
printouter(s)151 LOCAL printouter(s)
152 SYM *s;
153 {
154 if (s->func != NIL) {
155 printouter(s->func);
156 }
157 printf("%s.", s->symbol);
158 }
159