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