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