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