1: # include "../ingres.h"
2: # include "../symbol.h"
3: # include "../tree.h"
4: # include "../pipes.h"
5: # include "ovqp.h"
6:
7: extern struct pipfrmt Inpipe, Outpipe;
8:
9: char *rdsym()
10: /*
11: ** Reads one symbol from the pipe
12: ** and inserts it in the next slot
13: ** on the Ovqpbuf.
14: **
15: ** returns address of list element.
16: */
17: {
18: register char *next;
19: register int i;
20: register int j;
21: extern char *Ovqpbuf;
22: char *need();
23:
24: next = need(Ovqpbuf, 2); /* get two bytes for type and length */
25:
26: if (j = rdpipe(P_NORM, &Inpipe, R_decomp, next, 2) !=2) /* get type and length */
27: syserr("rdsym:bad rdpipe %d", j);
28: i = *(next + 1) & 0377; /* get length of symbol */
29: # ifdef xOTR1
30: if (tTf(29, 0))
31: printf("RDSYM: sym %2.d len=%3.d\t",*next, i);
32: # endif
33:
34: if (i)
35: {
36: /* if i is odd round up and allocate enought space. */
37: /* alloc will guarantee an even byte adress */
38:
39: need(Ovqpbuf, i); /* get space for value */
40: if (j = rdpipe(P_NORM, &Inpipe, R_decomp, next+2, i) != i)
41: syserr("rdsym:bad rdpipe of %d", j);
42: }
43:
44: # ifdef xOTR1
45: if (tTf(29, 1))
46: if (((struct symbol *)next)->type != VAR)
47: prsym(next);
48: # endif
49:
50: if (Qvpointer >= MAXNODES)
51: ov_err(NODOVFLOW);
52: Qvect [Qvpointer++] = (struct symbol *) next;
53: return (next);
54: }
55:
56: /*
57: ** Sym_ad -- reasonable way of getting the address
58: ** of the last symbol read in.
59: **
60: */
61:
62: struct symbol **sym_ad()
63: {
64: return (&Qvect [Qvpointer - 1]);
65: }
66:
67:
68:
69: putvar(sym, desc, tup)
70: struct symbol *sym;
71: char tup[];
72: struct descriptor *desc;
73:
74: /*
75: ** putvar is called to insert a tuple
76: ** pointer into the list. Desc is a
77: ** descriptor struc of an open relation.
78: ** Tup is the tuple buffer for the relation.
79: */
80:
81: {
82: register struct descriptor *d;
83: register char *next;
84: register int attnum;
85: extern char *Ovqpbuf;
86: char *need();
87:
88: next = (char *) sym;
89: d = desc;
90:
91:
92: attnum = ((struct stacksym *)next)->value[0] & 0377;
93: next = need(Ovqpbuf, 4); /* get four more bytes */
94:
95: if (attnum)
96: {
97: /* attnum is a real attribute number */
98: if (attnum > d->relatts)
99: syserr("rdsym:bad att %d in %.12s", attnum, d->relid);
100: ((struct stacksym *)next)->type = d->relfrmt[attnum];
101: ((struct stacksym *)next)->len = d->relfrml[attnum];
102: ((struct stacksym *)next)->value[0] = (int) &tup[0] + d->reloff[attnum]; /* address within tuple buffer location */
103: }
104: else
105: {
106: /* attnum refers to the tuple id */
107: ((struct stacksym *)next)->type = TIDTYPE;
108: ((struct stacksym *)next)->len = TIDLEN; /* tids are longs */
109: ((struct stacksym *)next)->value[0] = (int) &Intid; /* address of tid */
110: }
111: # ifdef xOTR1
112: if (tTf(29, 3))
113: prsym(next - 4);
114: # endif
115: return;
116: }
Defined functions
rdsym
defined in line
9; used 6 times