Category : C Source Code
Archive   : SDB.ZIP
Filename : SDBINT.C

 
Output of file : SDBINT.C contained in archive : SDB.ZIP
/* SDB - boolean expression evaluator */

#include "sdbio.h"

static struct operand *stack[STACKMAX],**sptr;
static union codecell *cptr;

/* db_interpret - interpret a boolean expression */
int db_interpret(slptr)
struct sel *slptr;
{
struct operand *result;
int r;

/* check for empty where clause */
if ((cptr = slptr->sl_where) == NULL)
return (TRUE);

/* setup stack */
sptr = stack;

/* execute the code */
while ((*(*cptr++).c_operator)())
;

/* get the result from the top of stack */
result = *--sptr;
r = result->o_value.ov_boolean;
if (result->o_type == TEMP)
free(result);

/* make sure the stack is empty */
while (sptr != stack) {
if ((*sptr)->o_type == TEMP)
free(*sptr);
sptr -= 1;
}

/* return result */
return (r);
}

int db_xstop()
{
return (FALSE);
}

int db_xpush()
{
*sptr++ = (*cptr++).c_operand;
}

int db_xand()
{
return (boolean('&'));
}

int db_xor()
{
return (boolean('|'));
}

static int boolean(opr)
{
struct operand *lval,*rval,*result;
int lv,rv,r;

rval = *--sptr; lval = *--sptr;
lv = lval->o_value.ov_boolean;
rv = rval->o_value.ov_boolean;

if ((result = (struct operand *)malloc(sizeof(struct operand))) == NULL)
return (db_ferror(INSMEM));
result->o_type = TEMP;
switch (opr) {
case '&': r = (lv && rv);
break;
case '|': r = (lv || rv);
break;
}
result->o_value.ov_boolean = r;
*sptr++ = result;
if (lval->o_type == TEMP)
free(lval);
if (rval->o_type == TEMP)
free(rval);
return (TRUE);
}

int db_xnot()
{
struct operand *val,*result;

val = *--sptr;
if ((result = (struct operand *)malloc(sizeof(struct operand))) == NULL)
return (db_ferror(INSMEM));
result->o_type = TEMP;
result->o_value.ov_boolean = !val->o_value.ov_boolean;
*sptr++ = result;
if (val->o_type == TEMP)
free(val);
return (TRUE);
}

int db_xlss()
{
return (compare(LSS));
}

int db_xleq()
{
return (compare(LEQ));
}

int db_xeql()
{
return (compare(EQL));
}

int db_xgeq()
{
return (compare(GEQ));
}

int db_xgtr()
{
return (compare(GTR));
}

int db_xneq()
{
return (compare(NEQ));
}

static int compare(cmp)
{
struct operand *lval,*rval,*result;
int i;

rval = *--sptr; lval = *--sptr;
if ((result = (struct operand *)malloc(sizeof(struct operand))) == NULL)
return (db_ferror(INSMEM));
result->o_type = TEMP;

if (lval->o_value.ov_char.ovc_type == TCHAR)
i = comp(lval,rval);
else
i = ncomp(lval,rval);

switch (cmp) {
case LSS: i = (i < 0);
break;
case LEQ: i = (i <= 0);
break;
case EQL: i = (i == 0);
break;
case GEQ: i = (i >= 0);
break;
case GTR: i = (i > 0);
break;
case NEQ: i = (i != 0);
break;
}
result->o_value.ov_boolean = i;
*sptr++ = result;
if (lval->o_type == TEMP)
free(lval);
if (rval->o_type == TEMP)
free(rval);
return (TRUE);
}

static int comp(lval,rval)
struct operand *lval,*rval;
{
char *lptr,*rptr; int lctr,rctr;
int len;

lptr = lval->o_value.ov_char.ovc_string;
lctr = lval->o_value.ov_char.ovc_length;
rptr = rval->o_value.ov_char.ovc_string;
rctr = rval->o_value.ov_char.ovc_length;

while (lctr > 0 && (lptr[lctr-1] == 0 || lptr[lctr-1] == ' '))
lctr--;
while (rctr > 0 && (rptr[rctr-1] == 0 || rptr[rctr-1] == ' '))
rctr--;

if (lctr < rctr)
len = lctr;
else
len = rctr;

while ((len--) > 0) {
if (*lptr++ != *rptr++)
if (*--lptr < *--rptr)
return (-1);
else
return (1);
}

if (lctr == rctr)
return (0);
else if (lctr < rctr)
return (-1);
else
return (1);
}

static int ncomp(lval,rval)
struct operand *lval,*rval;
{
char lstr[NUMBERMAX+1],rstr[NUMBERMAX+1];
int len;

strncpy(lstr,lval->o_value.ov_char.ovc_string,
(len = lval->o_value.ov_char.ovc_length)); lstr[len] = EOS;
strncpy(rstr,rval->o_value.ov_char.ovc_string,
(len = rval->o_value.ov_char.ovc_length)); rstr[len] = EOS;

return (db_cmp(lstr,rstr));
}



  3 Responses to “Category : C Source Code
Archive   : SDB.ZIP
Filename : SDBINT.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/