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