|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <symbol.h> ! 3: # include <tree.h> ! 4: # include <aux.h> ! 5: # include <sccs.h> ! 6: ! 7: SCCSID(@(#)treepr.c 8.1 12/31/84) ! 8: ! 9: /* ! 10: ** TREEPR -- print tree for debugging ! 11: ** ! 12: ** This routine prints a tree for debugging. ! 13: ** ! 14: ** Parameters: ! 15: ** tree -- root of tree to be printed ! 16: ** ! 17: ** Returns: ! 18: ** none ! 19: ** ! 20: ** Side Effects: ! 21: ** output to terminal ! 22: */ ! 23: ! 24: treepr(tree) ! 25: QTREE *tree; ! 26: { ! 27: register QTREE *t; ! 28: register int i; ! 29: ! 30: t = tree; ! 31: ! 32: printf("Querytree @ %x:\n", t); ! 33: ! 34: /* print range table */ ! 35: for (i = 0; i < MAXVAR + 1; i++) ! 36: { ! 37: if (Qt.qt_rangev[i].rngvdesc == NULL) ! 38: continue; ! 39: printf("range of %d is %.14s\n", ! 40: i, Qt.qt_rangev[i].rngvdesc->reldum.relid); ! 41: } ! 42: ! 43: /* print query type */ ! 44: if (Qt.qt_qmode >= 0) ! 45: printf("Qmode %d ", Qt.qt_qmode); ! 46: ! 47: /* print result relation if realistic */ ! 48: if (Qt.qt_resvar >= 0) ! 49: printf("resvar %d ", Qt.qt_resvar); ! 50: printf("\n"); ! 51: ! 52: /* print tree */ ! 53: rcsvtrpr(t); ! 54: ! 55: /* print exciting final stuff */ ! 56: printf("\n"); ! 57: } ! 58: /* ! 59: ** RCSVTRPR -- traverse and print tree ! 60: ** ! 61: ** This function does the real stuff for treepr. It recursively ! 62: ** traverses the tree in postfix order, printing each node. ! 63: ** ! 64: ** Parameters: ! 65: ** tree -- the root of the tree to print. ! 66: ** ! 67: ** Returns: ! 68: ** none ! 69: ** ! 70: ** Side Effects: ! 71: ** none ! 72: ** ! 73: ** Trace Flags: ! 74: ** none ! 75: */ ! 76: ! 77: static ! 78: rcsvtrpr(tree) ! 79: QTREE *tree; ! 80: { ! 81: register QTREE *t; ! 82: ! 83: t = tree; ! 84: ! 85: while (t != NULL) ! 86: { ! 87: nodepr(t); ! 88: rcsvtrpr(t->left); ! 89: t = t->right; ! 90: } ! 91: } ! 92: /* ! 93: ** NODEPR -- print tree node for debugging ! 94: ** ! 95: ** Parameters: ! 96: ** tree -- the node to print. ! 97: ** ! 98: ** Returns: ! 99: ** none ! 100: ** ! 101: ** Side Effects: ! 102: ** output to terminal ! 103: */ ! 104: ! 105: nodepr(tree) ! 106: QTREE *tree; ! 107: { ! 108: register QTREE *t; ! 109: register int ty; ! 110: int l; ! 111: char *cp; ! 112: ! 113: t = tree; ! 114: ty = t->sym.type; ! 115: l = t->sym.len & I1MASK; ! 116: ! 117: printf("%x: %x, %x/ ", t, t->left, t->right); ! 118: xputchar(ty); ! 119: printf("%d: ", l); ! 120: ! 121: switch (ty) ! 122: { ! 123: case VAR: ! 124: printf("%d.%d [", t->sym.value.sym_var.varno, ! 125: t->sym.value.sym_var.attno); ! 126: xputchar(t->sym.value.sym_var.varfrmt); ! 127: printf("%d]: %x", t->sym.value.sym_var.varfrml & I1MASK, ! 128: t->sym.value.sym_var.valptr); ! 129: if (t->sym.value.sym_var.varno == -1) ! 130: { ! 131: printf("\n\tSub var: "); ! 132: if (t->sym.value.sym_var.valptr != NULL) ! 133: nodepr((QTREE *) t->sym.value.sym_var.valptr); ! 134: else ! 135: printf("ERROR: no value\n"); ! 136: return; ! 137: } ! 138: else ! 139: { ! 140: if (t->sym.value.sym_var.valptr != NULL) ! 141: { ! 142: printf(" = "); ! 143: printatt(t->sym.value.sym_var.varfrmt, ! 144: t->sym.value.sym_var.varfrml, ! 145: t->sym.value.sym_var.valptr); ! 146: } ! 147: } ! 148: break; ! 149: ! 150: case RESDOM: ! 151: printf("%d [%c%d]", t->sym.value.sym_resdom.resno, ! 152: t->sym.value.sym_resdom.resfrmt, ! 153: t->sym.value.sym_resdom.resfrml); ! 154: break; ! 155: ! 156: case AOP: ! 157: printf("%d [%c%d] [%c%d]", t->sym.value.sym_op.opno, ! 158: t->sym.value.sym_op.opfrmt, t->sym.value.sym_op.opfrml, ! 159: t->sym.value.sym_op.agfrmt, t->sym.value.sym_op.agfrml); ! 160: break; ! 161: ! 162: case UOP: ! 163: case BOP: ! 164: case COP: ! 165: case INT: ! 166: case QMODE: ! 167: case RESULTVAR: ! 168: switch (t->sym.len) ! 169: { ! 170: case 1: ! 171: case 2: ! 172: printf("%d", t->sym.value.sym_data.i2type); ! 173: break; ! 174: ! 175: case 4: ! 176: printf("%ld", t->sym.value.sym_data.i4type); ! 177: break; ! 178: } ! 179: break; ! 180: ! 181: case FLOAT: ! 182: printf("%.10f", t->sym.value.sym_data.f4type); ! 183: break; ! 184: ! 185: case CHAR: ! 186: cp = t->sym.value.sym_data.c0type; ! 187: while (l--) ! 188: xputchar(*cp++); ! 189: break; ! 190: ! 191: case AND: ! 192: case ROOT: ! 193: case AGHEAD: ! 194: printf("[%d/%d] [%o/%o]", ! 195: t->sym.value.sym_root.tvarc, t->sym.value.sym_root.lvarc, ! 196: t->sym.value.sym_root.lvarm, t->sym.value.sym_root.rvarm); ! 197: if (ty != AND) ! 198: printf(" (%d)", t->sym.value.sym_root.rootuser); ! 199: break; ! 200: ! 201: case TREE: ! 202: case OR: ! 203: case QLEND: ! 204: case BYHEAD: ! 205: break; ! 206: ! 207: case RESULTID: ! 208: case SOURCEID: ! 209: printf("%.14s", t->sym.value.sym_data.c0type); ! 210: break; ! 211: ! 212: default: ! 213: syserr("nodepr: ty %d", ty); ! 214: } ! 215: printf("/\n"); ! 216: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.