1*22562Sdist /* 2*22562Sdist * Copyright (c) 1980 Regents of the University of California. 3*22562Sdist * All rights reserved. The Berkeley software License Agreement 4*22562Sdist * specifies the terms and conditions for redistribution. 5*22562Sdist */ 65538Slinton 7*22562Sdist #ifndef lint 8*22562Sdist static char sccsid[] = "@(#)prtree.c 5.1 (Berkeley) 06/06/85"; 9*22562Sdist #endif not lint 105538Slinton 115538Slinton /* 125538Slinton * Print a tree back out in Pascal form. 135538Slinton */ 145538Slinton 155538Slinton #include "defs.h" 165538Slinton #include "tree.h" 175538Slinton #include "sym.h" 185538Slinton #include "sym/btypes.h" 195538Slinton #include "tree.rep" 205538Slinton 215538Slinton prtree(p) 225538Slinton NODE *p; 235538Slinton { 245538Slinton OP op; 255538Slinton 265538Slinton if (p == NIL) { 275538Slinton return; 285538Slinton } 295538Slinton op = p->op; 305538Slinton if (op < O_NOP || op > O_LASTOP) { 315538Slinton panic("bad op %d in prtree", p->op); 325538Slinton } 335538Slinton switch (op) { 345538Slinton case O_NAME: { 355538Slinton SYM *s; 365538Slinton 375538Slinton s = p->nameval; 385538Slinton if (isredirected() || isambiguous(s)) { 395538Slinton printwhich(s); 405538Slinton } else { 415538Slinton printf("%s", name(s)); 425538Slinton } 435538Slinton break; 445538Slinton } 455538Slinton 465538Slinton case O_QNAME: 475538Slinton prtree(p->left); 485538Slinton printf(".%s", name(p->right->nameval)); 495538Slinton break; 505538Slinton 515538Slinton case O_QLINE: 525538Slinton prtree(p->left); 535538Slinton printf(":"); 545538Slinton prtree(p->right); 555538Slinton break; 565538Slinton 575538Slinton case O_LCON: 585538Slinton push(long, p->lconval); 595538Slinton printval(p->nodetype); 605538Slinton break; 615538Slinton 625538Slinton case O_FCON: 635538Slinton printf("%g", p->fconval); 645538Slinton break; 655538Slinton 665538Slinton case O_SCON: 675538Slinton printf("'%s'", p->sconval); 685538Slinton break; 695538Slinton 705538Slinton case O_INDEX: 715538Slinton prtree(p->left); 725538Slinton printf("["); 735538Slinton prtree(p->right); 745538Slinton printf("]"); 755538Slinton break; 765538Slinton 775538Slinton case O_COMMA: 785538Slinton prtree(p->left); 795538Slinton if (p->right != NIL) { 805538Slinton printf(", "); 815538Slinton prtree(p->right); 825538Slinton } 835538Slinton break; 845538Slinton 855538Slinton case O_RVAL: 865538Slinton case O_ITOF: 875538Slinton prtree(p->left); 885538Slinton break; 895538Slinton 905538Slinton case O_CALL: 915538Slinton prtree(p->left); 925538Slinton if (p->right != NIL) { 935538Slinton printf("("); 945538Slinton prtree(p->right); 955538Slinton printf(")"); 965538Slinton } 975538Slinton break; 985538Slinton 995538Slinton case O_INDIR: 1005538Slinton prtree(p->left); 1015538Slinton if (!isvarparam(p->left->nodetype)) { 1025538Slinton printf("^"); 1035538Slinton } 1045538Slinton break; 1055538Slinton 1065538Slinton default: 1075538Slinton switch(degree(op)) { 1085538Slinton case BINARY: 1095538Slinton prtree(p->left); 1105538Slinton printf("%s", opinfo[op].opstring); 1115538Slinton prtree(p->right); 1125538Slinton break; 1135538Slinton 1145538Slinton case UNARY: 1155538Slinton printf("%s", opinfo[op].opstring); 1165538Slinton prtree(p->left); 1175538Slinton break; 1185538Slinton 1195538Slinton default: 1205538Slinton panic("bad op %d in prtree", op); 1215538Slinton } 1225538Slinton break; 1235538Slinton } 1245538Slinton } 1255538Slinton 1265538Slinton /* 1275538Slinton * Print an error associated with a particular tree. 1285538Slinton * The string is searched for a "%t" which is replaced by 1295538Slinton * the printed representation of the tree. 1305538Slinton */ 1315538Slinton 1325538Slinton /* VARARGS2 */ 1335538Slinton trerror(s, tree, a, b, c, d, e, f, g, h, i, j) 1345538Slinton char *s; 1355538Slinton NODE *tree; 1365538Slinton { 1375538Slinton register char *p; 1385538Slinton 1395538Slinton fflush(stdout); 1405538Slinton for (p = s; *p != '\0'; p++) { 1415538Slinton if (p[0] == '%' && p[1] == 't') { 1425538Slinton fputc('"', stderr); 1435538Slinton prtree(tree); 1445538Slinton fflush(stdout); 1455538Slinton fputc('"', stderr); 1465538Slinton error(&p[2], a, b, c, d, e, f, g, h, i, j); 1475538Slinton /* NOTREACHED */ 1485538Slinton } 1495538Slinton fputc(*p, stderr); 1505538Slinton } 1515538Slinton panic("bad call to trerror"); 1525538Slinton } 153