date and time created 82/01/18 19:21:30 by linton
authorMark Linton <linton@ucbvax.Berkeley.EDU>
Tue, 19 Jan 1982 11:21:30 +0000 (03:21 -0800)
committerMark Linton <linton@ucbvax.Berkeley.EDU>
Tue, 19 Jan 1982 11:21:30 +0000 (03:21 -0800)
SCCS-vsn: usr.bin/pascal/pdx/tree/prtree.c 1.1

usr/src/usr.bin/pascal/pdx/tree/prtree.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/pascal/pdx/tree/prtree.c b/usr/src/usr.bin/pascal/pdx/tree/prtree.c
new file mode 100644 (file)
index 0000000..d489958
--- /dev/null
@@ -0,0 +1,146 @@
+/* Copyright (c) 1982 Regents of the University of California */
+
+static char sccsid[] = "@(#)prtree.c 1.1 %G%";
+
+/*
+ * Print a tree back out in Pascal form.
+ */
+
+#include "defs.h"
+#include "tree.h"
+#include "sym.h"
+#include "sym/btypes.h"
+#include "tree.rep"
+
+prtree(p)
+NODE *p;
+{
+       OP op;
+
+       if (p == NIL) {
+               return;
+       }
+       op = p->op;
+       if (op < O_NOP || op > O_LASTOP) {
+               panic("bad op %d in prtree", p->op);
+       }
+       switch (op) {
+               case O_NAME: {
+                       SYM *s;
+
+                       s = p->nameval;
+                       if (isredirected() || isambiguous(s)) {
+                               printwhich(s);
+                       } else {
+                               printf("%s", name(s));
+                       }
+                       break;
+               }
+
+               case O_QNAME:
+                       prtree(p->left);
+                       printf(".%s", name(p->right->nameval));
+                       break;
+
+               case O_QLINE:
+                       prtree(p->left);
+                       printf(":");
+                       prtree(p->right);
+                       break;
+
+               case O_LCON:
+                       push(long, p->lconval);
+                       printval(p->nodetype);
+                       break;
+
+               case O_FCON:
+                       printf("%g", p->fconval);
+                       break;
+
+               case O_SCON:
+                       printf("'%s'", p->sconval);
+                       break;
+
+               case O_INDEX:
+                       prtree(p->left);
+                       printf("[");
+                       prtree(p->right);
+                       printf("]");
+                       break;
+
+               case O_COMMA:
+                       prtree(p->left);
+                       if (p->right != NIL) {
+                               printf(", ");
+                               prtree(p->right);
+                       }
+                       break;
+
+               case O_RVAL:
+               case O_ITOF:
+                       prtree(p->left);
+                       break;
+
+               case O_CALL:
+                       prtree(p->left);
+                       if (p->right != NIL) {
+                               printf("(");
+                               prtree(p->right);
+                               printf(")");
+                       }
+                       break;
+
+               case O_INDIR:
+                       prtree(p->left);
+                       if (!isvarparam(p->left->nodetype)) {
+                               printf("^");
+                       }
+                       break;
+
+               default:
+                       switch(degree(op)) {
+                               case BINARY:
+                                       prtree(p->left);
+                                       printf("%s", opinfo[op].opstring);
+                                       prtree(p->right);
+                                       break;
+
+                               case UNARY:
+                                       printf("%s", opinfo[op].opstring);
+                                       prtree(p->left);
+                                       break;
+
+                               default:
+                                       panic("bad op %d in prtree", op);
+                       }
+                       break;
+       }
+}
+
+/*
+ * Print an error associated with a particular tree.
+ * The string is searched for a "%t" which is replaced by
+ * the printed representation of the tree.
+ */
+
+/* VARARGS2 */
+trerror(s, tree, a, b, c, d, e, f, g, h, i, j)
+char *s;
+NODE *tree;
+{
+       register char *p;
+
+       fflush(stdout);
+       for (p = s; *p != '\0'; p++) {
+               if (p[0] == '%' && p[1] == 't') {
+                       fputc('"', stderr);
+                       prtree(tree);
+                       fflush(stdout);
+                       fputc('"', stderr);
+                       error(&p[2], a, b, c, d, e, f, g, h, i, j);
+                       /* NOTREACHED */
+               }
+               fputc(*p, stderr);
+       }
+       panic("bad call to trerror");
+}