1: # include <ingres.h>
2: # include <aux.h>
3: # include <symbol.h>
4: # include <tree.h>
5: # include "../decomp/globs.h"
6: # include <sccs.h>
7: # include <errors.h>
8:
9: SCCSID(@(#)interp1.c 8.3 2/8/85)
10:
11:
12: /*
13: ** INTERP1.C
14: **
15: ** symbol I/O utility routines for OVQP interpreter.
16: **
17: */
18:
19: /*
20: ** GETSYMBOL
21: **
22: ** Gets (type, len, value) symbols from list
23: ** A ptr to the list is advanced after
24: ** call. Symbols are moved to a target location
25: ** (typically a slot on the interpreter's De.ov_stack).
26: ** Legality of symbol type and length is checked.
27: ** Returns 1 if no more symbols in list
28: ** 0 otherwise
29: **
30: */
31:
32: getsymbol(ts, p)
33: SYMBOL *ts; /* target location (on stack) */
34: SYMBOL ***p; /* pointer to list */
35: {
36: int len; /*length of target symbol*/
37: register union symvalue *d; /* ptr to data for target symbol */
38: register SYMBOL *cp; /* the item in the list */
39: register SYMBOL *tops; /* target location on stack */
40: register union symvalue *val;
41: register STRKEEPER *seen; /* Have we seen an s? */
42: register char *c; /* For debugging */
43: int start; /* save the start pos of a string */
44:
45: seen = 0;
46: tops = ts; /* copy stack pointer */
47: cp = **p; /* get list pointer */
48: tops->start = -1; /* initialize start to impossible value */
49:
50: # ifdef xOTR1
51: if (tTf(84, 0))
52: {
53: printf("GETSYM: ");
54: prsym(cp);
55: }
56: # endif
57:
58: if (tops >= (SYMBOL *) &De.ov_stack[STACKSIZ])
59: ov_err(STACKOVER);
60:
61: val = &cp->value;
62: /* decomp will put the s_var's value in the right place
63: * if this is the case
64: */
65: if (cp->type == VAR || cp->type == S_VAR)
66: {
67: tops->type = val->sym_var.varfrmt;
68: len = tops->len = val->sym_var.varfrml;
69: d = (union symvalue *) val->sym_var.valptr;
70: seen = (STRKEEPER *) val->sym_var.varstr;
71: val->sym_var.varstr = 0;
72: }
73: else
74: {
75: tops->type = cp->type;
76: len = tops->len = cp->len;
77: len &= I1MASK;
78: d = &cp->value;
79: }
80: /* advance De.ov_qvect sequencing pointer p */
81: *p += 1;
82:
83: switch(tops->type)
84: {
85: case INT:
86: switch (len)
87: {
88: case 1:
89: tops->value.sym_data.i2type = d->sym_data.i1type;
90: break;
91: case 2:
92: case 4:
93: bmove((char *) d, (char *) &tops->value.sym_data, len);
94: break;
95:
96: default:
97: syserr("getsym:bad int len %d",len);
98: }
99: break;
100:
101: case FLOAT:
102: switch (len)
103: {
104: case 4:
105: tops->value.sym_data.f8type = d->sym_data.f4type;
106: break;
107:
108: case 8:
109: tops->value.sym_data.f8type = d->sym_data.f8type;
110: break;
111:
112: default:
113: syserr("getsym:bad FLOAT len %d",len);
114: }
115: break;
116:
117: case CHAR:
118: {
119: if ( seen )
120: {
121: if ((c = (char *)grabstring(seen,d,1+(char *)tops, &start)) != NULL)
122: {
123: tops->value.sym_data.cptype = c;
124: /*tops->leavebl = 1; */
125: tops->start = start;
126: }
127: else
128: {
129: tops->value.sym_data.cptype = "\0";
130: tops->len = 0;
131: }
132: }
133: else
134: {
135: tops->value.sym_data.cptype = (char *)d;
136: seen = 0;
137: }
138: break;
139: }
140:
141: case AOP:
142: case BOP:
143: case UOP:
144: case COP:
145: tops->value.sym_op.opno = d->sym_op.opno;
146: break;
147:
148: case RESDOM:
149: tops->value.sym_resdom.resno = d->sym_resdom.resno;
150: break;
151:
152: case AND:
153: case OR:
154: break;
155:
156: case AGHEAD:
157: case BYHEAD:
158: case ROOT:
159: case QLEND:
160: return (1); /* all these are delimitors between lists */
161:
162: default:
163: syserr("getsym:bad type %d", tops->type);
164: }
165: return(0);
166: }
167: /*
168: ** TOUT
169: **
170: ** Copies a symbol value into the Output tuple buffer.
171: ** Used to write target
172: ** list elements or aggregate values into the output tuple.
173: */
174:
175: tout(s, offp, rlen)
176: register SYMBOL *s;
177: char *offp;
178: int rlen;
179: {
180: register int i;
181: register char *p;
182: int slen;
183:
184: # ifdef xOTR1
185: if (tTf(84, 3))
186: {
187: printf("TOUT: s=");
188: prstack(s);
189: printf(" offset=%d, rlen=%d\n", offp-De.ov_outtup, rlen);
190: }
191: # endif
192: if (s->type == CHAR)
193: {
194: slen = s->len & I1MASK;
195: rlen &= I1MASK;
196: i = rlen - slen; /* compute difference between sizes */
197: if (i <= 0)
198: {
199: bmove(s->value.sym_data.cptype, offp, rlen);
200: }
201: else
202: {
203: p = s->value.sym_data.cptype;
204: bmove(p, offp, slen);
205: p = &offp[slen];
206: while (i--)
207: *p++ = ' '; /* blank out remainder */
208: }
209: }
210: else
211: {
212: bmove((char *)&s->value, offp, rlen);
213: }
214: }
215:
216: /*
217: ** RCVT - convert a symbol to a given type
218: **
219: ** Parameters:
220: ** tos - the symbol
221: ** restype - the type to convert it to
222: ** reslen - the length of the type
223: **
224: ** Trace Flags:
225: ** 84.6
226: **
227: ** Called by:
228: ** interpret()
229: ** setallkey()
230: ** typecoerce()
231: */
232: rcvt(tos, restype, reslen)
233: register SYMBOL *tos;
234: int restype, reslen;
235: {
236: register int rtype, rlen;
237: int stype, slen;
238:
239: rtype = restype;
240: rlen = reslen;
241: stype = tos->type;
242: slen= tos->len;
243: # ifdef xOTR1
244: if (tTf(84, 6))
245: {
246: printf("RCVT:type=");
247: xputchar(rtype);
248: printf("%3d, tos=", rlen);
249: prstack(tos);
250: }
251: # endif
252:
253: if (rtype != stype)
254: {
255: if (rtype == CHAR || stype == CHAR)
256: ov_err(BADCONV); /* bad char to numeric conversion requested */
257: if (rtype == FLOAT)
258: itof(tos);
259: else
260: {
261: if (rlen == 4)
262: ftoi4(tos);
263: else
264: ftoi2(tos);
265: }
266: tos->len = rlen; /* handles conversion to i1 or f4 */
267: }
268:
269: else
270: {
271: if (rtype != CHAR && rlen != slen)
272: {
273: if (rtype == INT)
274: {
275: if (rlen == 4)
276: i2toi4(tos);
277: else if (slen == 4)
278: i4toi2(tos);
279: }
280: tos->len = rlen; /* handles conversion to i1 or f4 */
281: }
282: }
283: # ifdef xOTR3
284: if (tTf(84, 6))
285: {
286: printf("RCVT rets: symbol: ");
287: prsym(tos);
288: }
289: # endif
290: }
Defined functions
rcvt
defined in line
232; used 3 times
tout
defined in line
175; used 2 times