1: # include <ingres.h>
2: # include <aux.h>
3: # include <tree.h>
4: # include <symbol.h>
5: # include "globs.h"
6: # include <sccs.h>
7:
8: SCCSID(@(#)setvar.c 8.1 12/31/84)
9:
10: /*
11: ** SETVAR -- Routines to convert a VAR to a constant and back to a VAR
12: **
13: ** This file contains the routines for tuple substitution.
14: **
15: ** Setvar -- Make a VAR node reference its position in the tuple.
16: **
17: ** Clrvar -- Make the VAR node refer back to a VAR
18: */
19: /*
20: ** SETVAR
21: **
22: ** Var's are changed to reference their values in a tuple.
23: ** ROOT and AND nodes are changed to update the variable maps.
24: **
25: ** Trace Flags:
26: ** 53
27: */
28:
29: setvar(tree, var, intid, tuple)
30: register QTREE *tree;
31: int var;
32: TID *intid;
33: char *tuple;
34: {
35: register int mask, nvc;
36: DESC *readopen();
37: extern QTREE *ckvar();
38:
39: if (tree == NULL)
40: return;
41: switch (tree->sym.type)
42: {
43: case VAR:
44: if ((tree=ckvar(tree))->sym.value.sym_var.varno == var)
45: {
46: # ifdef xDTR1
47: if (tTf(53, 0))
48: {
49: printf("setvar:%d;tree:", var);
50: nodepr(tree);
51: }
52: # endif
53: if (tree->sym.value.sym_var.attno)
54: tree->sym.value.sym_var.valptr =
55: (ANYTYPE *) (tuple + readopen(var)->reloff[tree->sym.value.sym_var.attno]);
56: else
57: tree->sym.value.sym_var.valptr = (ANYTYPE *) intid;
58: }
59: return;
60:
61: case ROOT:
62: case AND:
63: mask = 01 << var;
64: nvc = tree->sym.value.sym_root.tvarc;
65: if (tree->sym.value.sym_root.lvarm & mask)
66: {
67: setvar(tree->left, var, intid, tuple);
68: tree->sym.value.sym_root.lvarm &= ~mask;
69: --tree->sym.value.sym_root.lvarc;
70: nvc = tree->sym.value.sym_root.tvarc - 1;
71: }
72: if (tree->sym.value.sym_root.rvarm & mask)
73: {
74: setvar(tree->right, var, intid, tuple);
75: tree->sym.value.sym_root.rvarm &= ~mask;
76: nvc = tree->sym.value.sym_root.tvarc - 1;
77: }
78: tree->sym.value.sym_root.tvarc = nvc;
79: return;
80:
81: default:
82: setvar(tree->left, var, intid, tuple);
83: setvar(tree->right, var, intid, tuple);
84: return;
85: }
86: }
87: /*
88: ** Clearvar is the opposite of setvar. For
89: ** each occurence of var1 in the tree, clear
90: ** the valptr.
91: */
92:
93: clearvar(tree, var)
94: register QTREE *tree;
95: register int var;
96: {
97: extern QTREE *ckvar();
98:
99: if (tree == NULL)
100: return;
101:
102: if (tree->sym.type == VAR)
103: {
104: if ((tree = ckvar(tree))->sym.value.sym_var.varno == var)
105: tree->sym.value.sym_var.valptr = 0;
106: return;
107: }
108: clearvar(tree->left, var);
109: clearvar(tree->right, var);
110: }
Defined functions
setvar
defined in line
8; used 5 times