1*22525Sdist /* 2*22525Sdist * Copyright (c) 1980 Regents of the University of California. 3*22525Sdist * All rights reserved. The Berkeley software License Agreement 4*22525Sdist * specifies the terms and conditions for redistribution. 5*22525Sdist */ 65523Slinton 7*22525Sdist #ifndef lint 8*22525Sdist static char sccsid[] = "@(#)print.c 5.1 (Berkeley) 06/06/85"; 9*22525Sdist #endif not lint 105523Slinton /* 115523Slinton * Routines to print out symbols. 125523Slinton */ 135523Slinton 145523Slinton #include "defs.h" 155523Slinton #include "sym.h" 165523Slinton #include "process.h" 175523Slinton #include "tree.h" 185523Slinton #include "runtime.h" 195523Slinton #include "classes.h" 205523Slinton #include "sym.rep" 215523Slinton #include "process/process.rep" 225523Slinton 235523Slinton /* 245523Slinton * Note the entry of the given block, unless it's the main program. 255523Slinton */ 265523Slinton 275523Slinton printentry(s) 285523Slinton SYM *s; 295523Slinton { 305523Slinton if (s != program) { 315523Slinton printf("\nentering %s %s\n", classname(s), s->symbol); 325523Slinton } 335523Slinton } 345523Slinton 355523Slinton /* 365523Slinton * Note the exit of the given block 375523Slinton */ 385523Slinton 395523Slinton printexit(s) 405523Slinton SYM *s; 415523Slinton { 425523Slinton if (s != program) { 435523Slinton printf("leaving %s %s\n\n", classname(s), s->symbol); 445523Slinton } 455523Slinton } 465523Slinton 475523Slinton /* 485523Slinton * Note the call of s from t. 495523Slinton */ 505523Slinton 515523Slinton printcall(s, t) 525523Slinton SYM *s, *t; 535523Slinton { 545523Slinton printf("calling %s", s->symbol); 555523Slinton printparams(s, NIL); 565523Slinton printf(" from %s %s\n", classname(t), t->symbol); 575523Slinton } 585523Slinton 595523Slinton /* 605523Slinton * Note the return from s. If s is a function, print the value 615523Slinton * it is returning. This is somewhat painful, since the function 625523Slinton * has actually just returned. 635523Slinton */ 645523Slinton 655523Slinton printrtn(s) 665523Slinton SYM *s; 675523Slinton { 685523Slinton register SYM *t; 695523Slinton register int len; 705523Slinton 715523Slinton printf("returning "); 725523Slinton if (s->class == FUNC) { 735523Slinton len = size(s->type); 745523Slinton dread(sp, process->sp, len); 755523Slinton sp += len; 765523Slinton printval(s->type); 775523Slinton putchar(' '); 785523Slinton } 795523Slinton printf("from %s\n", s->symbol); 805523Slinton } 815523Slinton 825523Slinton /* 835523Slinton * Print the values of the parameters of the given procedure or function. 845523Slinton * The frame distinguishes recursive instances of a procedure. 855523Slinton */ 865523Slinton 875523Slinton printparams(f, frame) 885523Slinton SYM *f; 895523Slinton FRAME *frame; 905523Slinton { 915523Slinton SYM *param; 925523Slinton 935523Slinton for (param = f->chain; param != NIL; param = param->chain) { 945523Slinton if (param == f->chain) { 955523Slinton printf("("); 965523Slinton } 975523Slinton printv(param, frame); 985523Slinton if (param->chain != NIL) { 995523Slinton printf(", "); 1005523Slinton } else { 1015523Slinton printf(")"); 1025523Slinton } 1035523Slinton } 1045523Slinton } 1055523Slinton 1065523Slinton /* 1075523Slinton * Print the name and value of a variable. 1085523Slinton */ 1095523Slinton 1105523Slinton printv(s, frame) 1115523Slinton SYM *s; 1125523Slinton FRAME *frame; 1135523Slinton { 1145523Slinton ADDRESS addr; 1155523Slinton int len; 1165523Slinton 1175523Slinton if (s->class == REF) { 1185523Slinton dread(&addr, address(s, frame), sizeof(ADDRESS)); 1195523Slinton len = size(s->type); 1205523Slinton } else { 1215523Slinton addr = address(s, frame); 1225523Slinton len = size(s); 1235523Slinton } 1245523Slinton printf("%s = ", s->symbol); 1255564Slinton if (!rpush(addr, len)) { 1265564Slinton printf("*** expression too large ***"); 1275523Slinton } else { 1285564Slinton if (s->class == REF || s->class == VAR) { 1295564Slinton printval(s->type); 1305564Slinton } else { 1315564Slinton printval(s); 1325564Slinton } 1335523Slinton } 1345523Slinton } 1355523Slinton 1365523Slinton /* 1375523Slinton * Print the fully specified variable that is described by the given identifer. 1385523Slinton */ 1395523Slinton 1405523Slinton printwhich(s) 1415523Slinton SYM *s; 1425523Slinton { 1435523Slinton printouter(s->func); 1445523Slinton printf("%s", s->symbol); 1455523Slinton } 1465523Slinton 1475523Slinton LOCAL printouter(s) 1485523Slinton SYM *s; 1495523Slinton { 1505523Slinton if (s->func != NIL) { 1515523Slinton printouter(s->func); 1525523Slinton } 1535523Slinton printf("%s.", s->symbol); 1545523Slinton } 155