#include "config.h"
#include "mud.h"
#include "u.h"
#include "y.tab.h"
/* "cast" a node as a true/false value */
int
eval_castbool(n)
Nod *n;
{
if(n->rv.t == NUM && n->rv.iv != 0)
return(1);
if(n->rv.t == STR && n->rv.cv != (char *)0 && n->rv.cv[0] != '\0')
return(1);
if(n->rv.t == OID)
return(cache_check(n->rv.cv));
return(0);
}
/* "cast" a node as an int */
eval_castint(n)
Nod *n;
{
switch(n->rv.t) {
case STR:
case OID:
return(atoi(n->rv.cv));
case NUM:
return(n->rv.iv);
case VNULL:
return(0);
}
return(0);
}
/* "cast" a node as a string */
char *
eval_caststr(n)
Nod *n;
{
switch(n->rv.t) {
case STR:
case OID:
return(n->rv.cv);
case NUM:
{
char nbuf[MAXOID];
return(tmpstr(itoa(n->rv.iv,nbuf)));
}
case VNULL:
return("NULL");
}
return("");
}
/* adopt a node's rv into our nval or rv */
void
eval_adopt(n1,n2,lrh)
Nod *n1;
Nod *n2;
int lrh;
{
if(lrh)
n2->nv.t = n1->rv.t;
else
n2->rv.t = n1->rv.t;
switch(n1->rv.t) {
case STR:
case OID:
if(lrh)
n2->nv.cv = n1->rv.cv;
else
n2->rv.cv = n1->rv.cv;
break;
case NUM:
case VNULL:
if(lrh)
n2->nv.iv = n1->rv.iv;
else
n2->rv.iv = n1->rv.iv;
break;
/* some types (like subtrees) we don't assign to! */
default:
if(lrh) {
n2->nv.t = VNULL;
n2->nv.iv = UERR_ILLASGN;
} else {
n2->rv.t = VNULL;
n2->rv.iv = UERR_ILLASGN;
}
}
}