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