untermud/DOC/
untermud/DOC/U/
untermud/DOC/U/U-examples/
untermud/DOC/internals/
untermud/DOC/wizard/
untermud/MISC/
untermud/MISC/dbchk/
untermud/RWHO/
untermud/RWHO/rwhod/
#include    "config.h"
#include    "mud.h"
#include    "u.h"
#include    "y.tab.h"


/* "cast" a node as a true/false value */
int eval_castbool (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 */
int eval_castint (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, 10)));
    }
  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;
    }

  }
}