xref: /original-bsd/usr.bin/pascal/pdx/sym/print.c (revision c3e32dec)
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 
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 
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 
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 
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 
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 
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 
144 printwhich(s)
145 SYM *s;
146 {
147 	printouter(s->func);
148 	printf("%s", s->symbol);
149 }
150 
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