xref: /csrg-svn/usr.bin/pascal/pdx/tree/prtree.c (revision 62163)
148069Sbostic /*-
2*62163Sbostic  * Copyright (c) 1980, 1993
3*62163Sbostic  *	The Regents of the University of California.  All rights reserved.
448069Sbostic  *
548069Sbostic  * %sccs.include.redist.c%
622562Sdist  */
75538Slinton 
822562Sdist #ifndef lint
9*62163Sbostic static char sccsid[] = "@(#)prtree.c	8.1 (Berkeley) 06/06/93";
1048069Sbostic #endif /* not lint */
115538Slinton 
125538Slinton /*
135538Slinton  * Print a tree back out in Pascal form.
145538Slinton  */
155538Slinton 
165538Slinton #include "defs.h"
175538Slinton #include "tree.h"
185538Slinton #include "sym.h"
195538Slinton #include "sym/btypes.h"
205538Slinton #include "tree.rep"
215538Slinton 
prtree(p)225538Slinton prtree(p)
235538Slinton NODE *p;
245538Slinton {
255538Slinton 	OP op;
265538Slinton 
275538Slinton 	if (p == NIL) {
285538Slinton 		return;
295538Slinton 	}
305538Slinton 	op = p->op;
315538Slinton 	if (op < O_NOP || op > O_LASTOP) {
325538Slinton 		panic("bad op %d in prtree", p->op);
335538Slinton 	}
345538Slinton 	switch (op) {
355538Slinton 		case O_NAME: {
365538Slinton 			SYM *s;
375538Slinton 
385538Slinton 			s = p->nameval;
395538Slinton 			if (isredirected() || isambiguous(s)) {
405538Slinton 				printwhich(s);
415538Slinton 			} else {
425538Slinton 				printf("%s", name(s));
435538Slinton 			}
445538Slinton 			break;
455538Slinton 		}
465538Slinton 
475538Slinton 		case O_QNAME:
485538Slinton 			prtree(p->left);
495538Slinton 			printf(".%s", name(p->right->nameval));
505538Slinton 			break;
515538Slinton 
525538Slinton 		case O_QLINE:
535538Slinton 			prtree(p->left);
545538Slinton 			printf(":");
555538Slinton 			prtree(p->right);
565538Slinton 			break;
575538Slinton 
585538Slinton 		case O_LCON:
595538Slinton 			push(long, p->lconval);
605538Slinton 			printval(p->nodetype);
615538Slinton 			break;
625538Slinton 
635538Slinton 		case O_FCON:
645538Slinton 			printf("%g", p->fconval);
655538Slinton 			break;
665538Slinton 
675538Slinton 		case O_SCON:
685538Slinton 			printf("'%s'", p->sconval);
695538Slinton 			break;
705538Slinton 
715538Slinton 		case O_INDEX:
725538Slinton 			prtree(p->left);
735538Slinton 			printf("[");
745538Slinton 			prtree(p->right);
755538Slinton 			printf("]");
765538Slinton 			break;
775538Slinton 
785538Slinton 		case O_COMMA:
795538Slinton 			prtree(p->left);
805538Slinton 			if (p->right != NIL) {
815538Slinton 				printf(", ");
825538Slinton 				prtree(p->right);
835538Slinton 			}
845538Slinton 			break;
855538Slinton 
865538Slinton 		case O_RVAL:
875538Slinton 		case O_ITOF:
885538Slinton 			prtree(p->left);
895538Slinton 			break;
905538Slinton 
915538Slinton 		case O_CALL:
925538Slinton 			prtree(p->left);
935538Slinton 			if (p->right != NIL) {
945538Slinton 				printf("(");
955538Slinton 				prtree(p->right);
965538Slinton 				printf(")");
975538Slinton 			}
985538Slinton 			break;
995538Slinton 
1005538Slinton 		case O_INDIR:
1015538Slinton 			prtree(p->left);
1025538Slinton 			if (!isvarparam(p->left->nodetype)) {
1035538Slinton 				printf("^");
1045538Slinton 			}
1055538Slinton 			break;
1065538Slinton 
1075538Slinton 		default:
1085538Slinton 			switch(degree(op)) {
1095538Slinton 				case BINARY:
1105538Slinton 					prtree(p->left);
1115538Slinton 					printf("%s", opinfo[op].opstring);
1125538Slinton 					prtree(p->right);
1135538Slinton 					break;
1145538Slinton 
1155538Slinton 				case UNARY:
1165538Slinton 					printf("%s", opinfo[op].opstring);
1175538Slinton 					prtree(p->left);
1185538Slinton 					break;
1195538Slinton 
1205538Slinton 				default:
1215538Slinton 					panic("bad op %d in prtree", op);
1225538Slinton 			}
1235538Slinton 			break;
1245538Slinton 	}
1255538Slinton }
1265538Slinton 
1275538Slinton /*
1285538Slinton  * Print an error associated with a particular tree.
1295538Slinton  * The string is searched for a "%t" which is replaced by
1305538Slinton  * the printed representation of the tree.
1315538Slinton  */
1325538Slinton 
1335538Slinton /* VARARGS2 */
trerror(s,tree,a,b,c,d,e,f,g,h,i,j)1345538Slinton trerror(s, tree, a, b, c, d, e, f, g, h, i, j)
1355538Slinton char *s;
1365538Slinton NODE *tree;
1375538Slinton {
1385538Slinton 	register char *p;
1395538Slinton 
1405538Slinton 	fflush(stdout);
1415538Slinton 	for (p = s; *p != '\0'; p++) {
1425538Slinton 		if (p[0] == '%' && p[1] == 't') {
1435538Slinton 			fputc('"', stderr);
1445538Slinton 			prtree(tree);
1455538Slinton 			fflush(stdout);
1465538Slinton 			fputc('"', stderr);
1475538Slinton 			error(&p[2], a, b, c, d, e, f, g, h, i, j);
1485538Slinton 			/* NOTREACHED */
1495538Slinton 		}
1505538Slinton 		fputc(*p, stderr);
1515538Slinton 	}
1525538Slinton 	panic("bad call to trerror");
1535538Slinton }
154