TinyMAZE/
TinyMAZE/config/
TinyMAZE/doc/
TinyMAZE/run/msgs/
TinyMAZE/src/
TinyMAZE/src/db/
TinyMAZE/src/ident/
TinyMAZE/src/io/
TinyMAZE/src/prog/
TinyMAZE/src/softcode/
TinyMAZE/src/util/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "db.h"
#include "externs.h"
#include "softcode.h"

static int ok_var_name(char *varname)
{
  char *p;

  if(!string_compare(varname, "player"))
    return(0);

  for(p = varname;*p;p++)
    if(isspace(*p) || is_sign(*p) || *p == '(' || *p == ')' ||
      *p == '~')
    {
      return(0);
    }

  return(1);
}

SCVAR *find_var(char *varname, bool type)
{
  SCVAR *c;

  for(c = code_ptr->vars;c;c = c->next)
    if(c->type == type)
      if(!string_compare(c->name, varname))
        break;

  return(c);
}

SCVAR *new_scvar(CODE *cptr, char *varname, bool type)
{
  SCVAR *newvar;

  newvar = (SCVAR *)stack_alloc(sizeof(SCVAR), 1, 0);

  newvar->type = type;
  newvar->name = stack_string_alloc(varname, 1);
  newvar->cvalue = stack_string_alloc("\"\"", 1);
  newvar->nvalue = 0;
  newvar->can_modify = 1;
 
  newvar->next = cptr->vars;
  cptr->vars = newvar;

  return(newvar);
}

char *cvar_val(char *varname)
{
  SCVAR *c;

  if(!(c = find_var(varname, VAR_STR)))
  {
    if(!ok_var_name(varname))
    {
      syntax_error();
      return("");
    }

    c = new_scvar(code_ptr, varname, VAR_STR);
  }

  return(c->cvalue);
}

int ivar_val(char *varname)
{
  SCVAR *i;

  if(!(i = find_var(varname, VAR_NUM)))
  {
    if(!ok_var_name(varname))
    {
      syntax_error();
      return(0);
    }

    i = new_scvar(code_ptr, varname, VAR_NUM);
  }

  return(i->nvalue);
}

bool get_varname(char *str, char *retbuf)
{
  char *p;

  for(p = retbuf;*str;str++, p++)
  {
    if(isspace(*str) || is_sign(*str) || *str == '(' || *str == ')' ||
      *str == '~')
    {
      break;
    }
    *p = *str;
  }
  *p = '\0';

  return((*str)?0:1);
}