1: # include "../ingres.h"
2: # include "../symbol.h"
3: # include "../tree.h"
4: # include "../pipes.h"
5: # include "../batch.h"
6: # include "ovqp.h"
7:
8: /*
9: ** This file contains all the routines needed
10: ** for communicating with the equel process.
11: ** They are called only if the flag Equel = TRUE.
12: */
13:
14: /* global equel pipebuffer */
15: struct pipfrmt Eoutpipe;
16:
17:
18: equelatt(ss)
19: struct symbol *ss;
20:
21: /*
22: ** equelatt writes one symbol pointed to
23: ** by ss up the data pipe to the equel
24: ** process.
25: **
26: ** if a symbol is a character then *ss->value
27: ** contains a pointer to the character string.
28: ** otherwise the value is stored in successive
29: ** words starting in ss->value.
30: */
31:
32: {
33: # ifdef xOTR1
34: if (tTf(20, 0))
35: prstack(ss);
36: # endif
37: pwritesym(&Eoutpipe, W_front, ss);
38: }
39:
40:
41: equeleol(code)
42: int code;
43:
44: /*
45: ** equeleol is called at the end of the interpretation of
46: ** a tuple. Its purpose is to write an end-of-tuple
47: ** symbol to the equel process and flush the pipe.
48: **
49: ** It is also called at the end of a query to write
50: ** an exit symbol to equel.
51: **
52: ** History:
53: ** 1/22/79 -- (marc) modified so won't flush pipe
54: ** buffer after each tuple
55: */
56:
57: {
58: register int mode;
59: struct symbol symb;
60:
61: if (code == EXIT)
62: mode = P_END;
63: else
64: mode = P_FLUSH;
65:
66: symb.type = code;
67: symb.len = 0;
68:
69: # ifdef xOTR1
70: if (tTf(20, 3))
71: printf("equeleol:writing %d to equel\n", code);
72: # endif
73:
74: wrpipe(P_NORM, &Eoutpipe, W_front, &symb, 2);
75: if (mode != P_FLUSH || Equel != 2)
76: wrpipe(mode, &Eoutpipe, W_front);
77: }
78:
79:
80: pwritesym(pipedesc, filedesc, ss)
81: struct pipfrmt *pipedesc;
82: int filedesc;
83: struct stacksym *ss;
84:
85: /*
86: ** pwritesym write the stacksymbol
87: ** pointed to by "ss" to the pipe
88: ** indicated by filedesc.
89: **
90: ** The destination will either be equel
91: ** or decomp
92: **
93: ** Since a CHAR isn't stored immediately following
94: ** the type and len of the symbol, A small bit
95: ** of manipulation must be done.
96: */
97:
98: {
99: register struct stacksym *s;
100: register char *p;
101: register int length;
102:
103: s = ss;
104: length = s->len & 0377;
105:
106: if (s->type == CHAR)
107: {
108: wrpipe(P_NORM, pipedesc, filedesc, s, 2); /* write the type and length */
109: p = cpderef(ss->value); /* p points to the string */
110: }
111: else
112: {
113: p = (char *) ss;
114: length += 2; /* include two bytes for type and length */
115: }
116: wrpipe(P_NORM, pipedesc, filedesc, p, length);
117: }
Defined functions
Defined variables