15523Slinton /* Copyright (c) 1982 Regents of the University of California */ 25523Slinton 3*5564Slinton static char sccsid[] = "@(#)print.c 1.2 01/19/82"; 45523Slinton 55523Slinton /* 65523Slinton * Routines to print out symbols. 75523Slinton */ 85523Slinton 95523Slinton #include "defs.h" 105523Slinton #include "sym.h" 115523Slinton #include "process.h" 125523Slinton #include "tree.h" 135523Slinton #include "runtime.h" 145523Slinton #include "classes.h" 155523Slinton #include "sym.rep" 165523Slinton #include "process/process.rep" 175523Slinton 185523Slinton /* 195523Slinton * Note the entry of the given block, unless it's the main program. 205523Slinton */ 215523Slinton 225523Slinton printentry(s) 235523Slinton SYM *s; 245523Slinton { 255523Slinton if (s != program) { 265523Slinton printf("\nentering %s %s\n", classname(s), s->symbol); 275523Slinton } 285523Slinton } 295523Slinton 305523Slinton /* 315523Slinton * Note the exit of the given block 325523Slinton */ 335523Slinton 345523Slinton printexit(s) 355523Slinton SYM *s; 365523Slinton { 375523Slinton if (s != program) { 385523Slinton printf("leaving %s %s\n\n", classname(s), s->symbol); 395523Slinton } 405523Slinton } 415523Slinton 425523Slinton /* 435523Slinton * Note the call of s from t. 445523Slinton */ 455523Slinton 465523Slinton printcall(s, t) 475523Slinton SYM *s, *t; 485523Slinton { 495523Slinton printf("calling %s", s->symbol); 505523Slinton printparams(s, NIL); 515523Slinton printf(" from %s %s\n", classname(t), t->symbol); 525523Slinton } 535523Slinton 545523Slinton /* 555523Slinton * Note the return from s. If s is a function, print the value 565523Slinton * it is returning. This is somewhat painful, since the function 575523Slinton * has actually just returned. 585523Slinton */ 595523Slinton 605523Slinton printrtn(s) 615523Slinton SYM *s; 625523Slinton { 635523Slinton register SYM *t; 645523Slinton register int len; 655523Slinton 665523Slinton printf("returning "); 675523Slinton if (s->class == FUNC) { 685523Slinton len = size(s->type); 695523Slinton dread(sp, process->sp, len); 705523Slinton sp += len; 715523Slinton printval(s->type); 725523Slinton putchar(' '); 735523Slinton } 745523Slinton printf("from %s\n", s->symbol); 755523Slinton } 765523Slinton 775523Slinton /* 785523Slinton * Print the values of the parameters of the given procedure or function. 795523Slinton * The frame distinguishes recursive instances of a procedure. 805523Slinton */ 815523Slinton 825523Slinton printparams(f, frame) 835523Slinton SYM *f; 845523Slinton FRAME *frame; 855523Slinton { 865523Slinton SYM *param; 875523Slinton 885523Slinton for (param = f->chain; param != NIL; param = param->chain) { 895523Slinton if (param == f->chain) { 905523Slinton printf("("); 915523Slinton } 925523Slinton printv(param, frame); 935523Slinton if (param->chain != NIL) { 945523Slinton printf(", "); 955523Slinton } else { 965523Slinton printf(")"); 975523Slinton } 985523Slinton } 995523Slinton } 1005523Slinton 1015523Slinton /* 1025523Slinton * Print the name and value of a variable. 1035523Slinton */ 1045523Slinton 1055523Slinton printv(s, frame) 1065523Slinton SYM *s; 1075523Slinton FRAME *frame; 1085523Slinton { 1095523Slinton ADDRESS addr; 1105523Slinton int len; 1115523Slinton 1125523Slinton if (s->class == REF) { 1135523Slinton dread(&addr, address(s, frame), sizeof(ADDRESS)); 1145523Slinton len = size(s->type); 1155523Slinton } else { 1165523Slinton addr = address(s, frame); 1175523Slinton len = size(s); 1185523Slinton } 1195523Slinton printf("%s = ", s->symbol); 120*5564Slinton if (!rpush(addr, len)) { 121*5564Slinton printf("*** expression too large ***"); 1225523Slinton } else { 123*5564Slinton if (s->class == REF || s->class == VAR) { 124*5564Slinton printval(s->type); 125*5564Slinton } else { 126*5564Slinton printval(s); 127*5564Slinton } 1285523Slinton } 1295523Slinton } 1305523Slinton 1315523Slinton /* 1325523Slinton * Print the fully specified variable that is described by the given identifer. 1335523Slinton */ 1345523Slinton 1355523Slinton printwhich(s) 1365523Slinton SYM *s; 1375523Slinton { 1385523Slinton printouter(s->func); 1395523Slinton printf("%s", s->symbol); 1405523Slinton } 1415523Slinton 1425523Slinton LOCAL printouter(s) 1435523Slinton SYM *s; 1445523Slinton { 1455523Slinton if (s->func != NIL) { 1465523Slinton printouter(s->func); 1475523Slinton } 1485523Slinton printf("%s.", s->symbol); 1495523Slinton } 150