1*5538Slinton /* Copyright (c) 1982 Regents of the University of California */
2*5538Slinton 
3*5538Slinton static char sccsid[] = "@(#)prtree.c 1.1 01/18/82";
4*5538Slinton 
5*5538Slinton /*
6*5538Slinton  * Print a tree back out in Pascal form.
7*5538Slinton  */
8*5538Slinton 
9*5538Slinton #include "defs.h"
10*5538Slinton #include "tree.h"
11*5538Slinton #include "sym.h"
12*5538Slinton #include "sym/btypes.h"
13*5538Slinton #include "tree.rep"
14*5538Slinton 
15*5538Slinton prtree(p)
16*5538Slinton NODE *p;
17*5538Slinton {
18*5538Slinton 	OP op;
19*5538Slinton 
20*5538Slinton 	if (p == NIL) {
21*5538Slinton 		return;
22*5538Slinton 	}
23*5538Slinton 	op = p->op;
24*5538Slinton 	if (op < O_NOP || op > O_LASTOP) {
25*5538Slinton 		panic("bad op %d in prtree", p->op);
26*5538Slinton 	}
27*5538Slinton 	switch (op) {
28*5538Slinton 		case O_NAME: {
29*5538Slinton 			SYM *s;
30*5538Slinton 
31*5538Slinton 			s = p->nameval;
32*5538Slinton 			if (isredirected() || isambiguous(s)) {
33*5538Slinton 				printwhich(s);
34*5538Slinton 			} else {
35*5538Slinton 				printf("%s", name(s));
36*5538Slinton 			}
37*5538Slinton 			break;
38*5538Slinton 		}
39*5538Slinton 
40*5538Slinton 		case O_QNAME:
41*5538Slinton 			prtree(p->left);
42*5538Slinton 			printf(".%s", name(p->right->nameval));
43*5538Slinton 			break;
44*5538Slinton 
45*5538Slinton 		case O_QLINE:
46*5538Slinton 			prtree(p->left);
47*5538Slinton 			printf(":");
48*5538Slinton 			prtree(p->right);
49*5538Slinton 			break;
50*5538Slinton 
51*5538Slinton 		case O_LCON:
52*5538Slinton 			push(long, p->lconval);
53*5538Slinton 			printval(p->nodetype);
54*5538Slinton 			break;
55*5538Slinton 
56*5538Slinton 		case O_FCON:
57*5538Slinton 			printf("%g", p->fconval);
58*5538Slinton 			break;
59*5538Slinton 
60*5538Slinton 		case O_SCON:
61*5538Slinton 			printf("'%s'", p->sconval);
62*5538Slinton 			break;
63*5538Slinton 
64*5538Slinton 		case O_INDEX:
65*5538Slinton 			prtree(p->left);
66*5538Slinton 			printf("[");
67*5538Slinton 			prtree(p->right);
68*5538Slinton 			printf("]");
69*5538Slinton 			break;
70*5538Slinton 
71*5538Slinton 		case O_COMMA:
72*5538Slinton 			prtree(p->left);
73*5538Slinton 			if (p->right != NIL) {
74*5538Slinton 				printf(", ");
75*5538Slinton 				prtree(p->right);
76*5538Slinton 			}
77*5538Slinton 			break;
78*5538Slinton 
79*5538Slinton 		case O_RVAL:
80*5538Slinton 		case O_ITOF:
81*5538Slinton 			prtree(p->left);
82*5538Slinton 			break;
83*5538Slinton 
84*5538Slinton 		case O_CALL:
85*5538Slinton 			prtree(p->left);
86*5538Slinton 			if (p->right != NIL) {
87*5538Slinton 				printf("(");
88*5538Slinton 				prtree(p->right);
89*5538Slinton 				printf(")");
90*5538Slinton 			}
91*5538Slinton 			break;
92*5538Slinton 
93*5538Slinton 		case O_INDIR:
94*5538Slinton 			prtree(p->left);
95*5538Slinton 			if (!isvarparam(p->left->nodetype)) {
96*5538Slinton 				printf("^");
97*5538Slinton 			}
98*5538Slinton 			break;
99*5538Slinton 
100*5538Slinton 		default:
101*5538Slinton 			switch(degree(op)) {
102*5538Slinton 				case BINARY:
103*5538Slinton 					prtree(p->left);
104*5538Slinton 					printf("%s", opinfo[op].opstring);
105*5538Slinton 					prtree(p->right);
106*5538Slinton 					break;
107*5538Slinton 
108*5538Slinton 				case UNARY:
109*5538Slinton 					printf("%s", opinfo[op].opstring);
110*5538Slinton 					prtree(p->left);
111*5538Slinton 					break;
112*5538Slinton 
113*5538Slinton 				default:
114*5538Slinton 					panic("bad op %d in prtree", op);
115*5538Slinton 			}
116*5538Slinton 			break;
117*5538Slinton 	}
118*5538Slinton }
119*5538Slinton 
120*5538Slinton /*
121*5538Slinton  * Print an error associated with a particular tree.
122*5538Slinton  * The string is searched for a "%t" which is replaced by
123*5538Slinton  * the printed representation of the tree.
124*5538Slinton  */
125*5538Slinton 
126*5538Slinton /* VARARGS2 */
127*5538Slinton trerror(s, tree, a, b, c, d, e, f, g, h, i, j)
128*5538Slinton char *s;
129*5538Slinton NODE *tree;
130*5538Slinton {
131*5538Slinton 	register char *p;
132*5538Slinton 
133*5538Slinton 	fflush(stdout);
134*5538Slinton 	for (p = s; *p != '\0'; p++) {
135*5538Slinton 		if (p[0] == '%' && p[1] == 't') {
136*5538Slinton 			fputc('"', stderr);
137*5538Slinton 			prtree(tree);
138*5538Slinton 			fflush(stdout);
139*5538Slinton 			fputc('"', stderr);
140*5538Slinton 			error(&p[2], a, b, c, d, e, f, g, h, i, j);
141*5538Slinton 			/* NOTREACHED */
142*5538Slinton 		}
143*5538Slinton 		fputc(*p, stderr);
144*5538Slinton 	}
145*5538Slinton 	panic("bad call to trerror");
146*5538Slinton }
147