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