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