xref: /csrg-svn/usr.bin/pascal/pdx/sym/print.c (revision 5564)
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