2.11BSD/ingres/source/equel/runtime/IIgettup.c
# include "../../ingres.h"
# include "../../symbol.h"
# include "../../pipes.h"
# include "IIglobals.h"
/*
** IIgettup is called to retrieve one instance
** of the target list into the c-variables.
**
** Integers and Floating point numbers can be converted
** to other numbers.
**
** Characters fields must match other character fields.
*/
IIgettup(file_name, line_no)
char *file_name;
int line_no;
{
register int length, domain;
register struct retsym *ret;
struct retsym sym;
char temp[256], *IIitos(), *s;
if (IIproc_name = file_name)
IIline_no = line_no;
if (IIerrflag)
return (0); /* error. no data will be coming */
ret = IIretsym;
domain = 0;
for (;;)
{
if (IIrdpipe(P_NORM, &IIeinpipe, IIr_front, &sym, 2) != 2)
IIsyserr("IIgettup bad rdpipe 1");
if (length = sym.len & 0377)
if (IIrdpipe(P_NORM, &IIeinpipe, IIr_front, temp, length) != length)
IIsyserr("IIgettup bad rdpipe-2 %d", length);
# ifdef xETR1
if (IIdebug)
{
printf("%s ent ", IIproc_name ? IIproc_name : "");
printf("gettup type %d len %d\n", sym.type, length);
}
# endif
domain++;
switch (sym.type)
{
case INT:
case FLOAT:
if (ret->type == CHAR)
{
s = IIitos(domain);
IIerror(1000, 1, &s);
return (0);
}
if (IIconvert(temp, ret->addr, sym.type, length, ret->type, ret->len & 0377) < 0)
{
s = IIitos(domain);
IIerror(1001, 1, &s);
}
break;
case CHAR:
if (ret->type != CHAR)
{
s = IIitos(domain);
IIerror(1002, 1, &s);
return (0);
}
IIbmove(temp, ret->addr, length);
ret->addr[length] = '\0'; /* null terminate string */
break;
case EOTUP:
return (1);
case EXIT:
return (0);
}
ret++;
}
}