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