1*48069Sbostic /*- 2*48069Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48069Sbostic * All rights reserved. 4*48069Sbostic * 5*48069Sbostic * %sccs.include.redist.c% 622562Sdist */ 75538Slinton 822562Sdist #ifndef lint 9*48069Sbostic static char sccsid[] = "@(#)prtree.c 5.2 (Berkeley) 04/16/91"; 10*48069Sbostic #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 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 */ 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