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.1 (Berkeley) 06/06/85"; 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 SYM *t; 69 register int len; 70 71 printf("returning "); 72 if (s->class == FUNC) { 73 len = size(s->type); 74 dread(sp, process->sp, len); 75 sp += len; 76 printval(s->type); 77 putchar(' '); 78 } 79 printf("from %s\n", s->symbol); 80 } 81 82 /* 83 * Print the values of the parameters of the given procedure or function. 84 * The frame distinguishes recursive instances of a procedure. 85 */ 86 87 printparams(f, frame) 88 SYM *f; 89 FRAME *frame; 90 { 91 SYM *param; 92 93 for (param = f->chain; param != NIL; param = param->chain) { 94 if (param == f->chain) { 95 printf("("); 96 } 97 printv(param, frame); 98 if (param->chain != NIL) { 99 printf(", "); 100 } else { 101 printf(")"); 102 } 103 } 104 } 105 106 /* 107 * Print the name and value of a variable. 108 */ 109 110 printv(s, frame) 111 SYM *s; 112 FRAME *frame; 113 { 114 ADDRESS addr; 115 int len; 116 117 if (s->class == REF) { 118 dread(&addr, address(s, frame), sizeof(ADDRESS)); 119 len = size(s->type); 120 } else { 121 addr = address(s, frame); 122 len = size(s); 123 } 124 printf("%s = ", s->symbol); 125 if (!rpush(addr, len)) { 126 printf("*** expression too large ***"); 127 } else { 128 if (s->class == REF || s->class == VAR) { 129 printval(s->type); 130 } else { 131 printval(s); 132 } 133 } 134 } 135 136 /* 137 * Print the fully specified variable that is described by the given identifer. 138 */ 139 140 printwhich(s) 141 SYM *s; 142 { 143 printouter(s->func); 144 printf("%s", s->symbol); 145 } 146 147 LOCAL printouter(s) 148 SYM *s; 149 { 150 if (s->func != NIL) { 151 printouter(s->func); 152 } 153 printf("%s.", s->symbol); 154 } 155