|
|
BSD 4.3
# include <ingres.h>
# include <aux.h>
# include <symbol.h>
# include <tree.h>
# include <batch.h>
# include "../ctlmod/pipes.h"
# include "../decomp/globs.h"
# include <sccs.h>
SCCSID(@(#)equelpr.c 8.2 1/17/85)
/*
** This file contains all the routines needed
** for communicating with the equel process.
** They are called only if the flag Equel = TRUE.
*/
pb_t EquelPb;
startequel()
{
pb_prime(&EquelPb, PB_REG);
EquelPb.pb_proc = PB_FRONT;
EquelPb.pb_st = PB_FRONT;
EquelPb.pb_stat |= PB_INFO;
}
/*
** equelatt writes one symbol pointed to
** by ss up the data pipe to the equel
** process.
**
** if a symbol is a character then *ss->value
** contains a pointer to the character string.
** otherwise the value is stored in successive
** words starting in ss->value.
*/
equelatt(ss)
SYMBOL *ss;
{
# ifdef xOTR1
if (tTf(80, 0))
prstack(ss);
# endif
pwritesym(ss);
}
/*
** equeleol is called at the end of the interpretation of
** a tuple. Its purpose is to write an end-of-tuple
** symbol to the equel process and flush the pipe.
**
** It is also called at the end of a query to write
** an exit symbol to equel.
*/
equeleol(code)
int code;
{
struct stacksym symb;
symb.s_type = code;
symb.s_len = 0;
# ifdef xOTR1
if (tTf(80, 3))
printf("equeleol:writing %d to equel\n", code);
# endif
pb_put((char *)&symb, TYP_LEN_SIZ, &EquelPb);
/* flush after every tuple for Equel versions before 6.2
* and at end of results always
*/
if (code == EXIT)
pb_flush(&EquelPb);
}
/*
** pwritesym write the stacksymbol
** pointed to by "ss" to the pipe
** indicated by filedesc.
**
** The destination will either be equel
** or decomp
**
** Since a CHAR isn't stored immediately following
** the type and len of the symbol, A small bit
** of manipulation must be done.
*/
pwritesym(s)
register SYMBOL *s;
{
register char *p;
register int length;
char cheat;
length = s->len & I1MASK;
pb_put((char *)s, TYP_LEN_SIZ, &EquelPb);
if (s->type == CHAR)
p = s->value.sym_data.cptype; /* p points to the string */
else
{
if ( s->type == INT && length == 1 )
{
cheat = s->value.sym_data.i1type;
pb_put(&cheat,length,&EquelPb);
return;
}
p = s->value.sym_data.c0type;
}
pb_put(p, length, &EquelPb);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.