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