Logo Search packages:      
Sourcecode: naim version File versions  Download package

vars.c

/*  ___  ___  ___ ___
** / __|/ _ \/ __/ __| secs
** \__ \  __/ (__\__ \ Copyright 1999-2004 Daniel Reed <n@ml.org>
** |___/\___|\___|___/ Simple Embedded Client Scripting
*/
#include <naim/secs.h>

void  secs_var_init(void) {
}

int   secs_var_set_str(secs_var_t *var, const char *val) {
      size_t      slen = 0;

      assert(var != NULL);
      assert(val != NULL);

      *(var->val_num) = 0;

      slen = strlen(val);
      if (*(var->val_str) == NULL) {
            *(var->val_str) = secs_mem_alloc(slen+1);
            var->length = slen;
      } else if (var->length < slen) {
            *(var->val_str) = secs_mem_realloc(*(var->val_str), slen+1);
            var->length = slen;
      }
      strncpy(*(var->val_str), val, var->length+1);
      return(1);
}

int   secs_var_set_int(secs_var_t *var, const char *value) {
      long int    ival = 0;
      size_t      slen = 0;
      int   numdigits = 0;
      register const char     *val = value;
      char  tmpbuf[11];
      long int    itmp;
      int   ret;

      assert(var != NULL);
      assert(val != NULL);

      while ((*val) && (isspace(*val) || ((*val == '0') && (*(val+1) != 0))))
            val++;
      if (!isdigit(*val))
            return(0);
      itmp = ival = atol(val);
      slen = strlen(val);
      do {
            numdigits++;
      } while ((itmp = (int)(itmp / 10)) > 0);
      assert(numdigits <= slen);
      if (slen == numdigits)
            ret = secs_var_set_str(var, val);
      else if (snprintf(tmpbuf, sizeof(tmpbuf), "%li", ival) == numdigits)
            ret = secs_var_set_str(var, tmpbuf);
      else
            ret = 0;
      *(var->val_num) = ival;
      return(ret);
}

int   secs_var_set_switch(secs_var_t *var, const char *val) {
      int   ret;

      assert(var != NULL);
      assert(val != NULL);

      if ((strcasecmp(val, "ON") == 0)
            || (strcasecmp(val, "1") == 0)
            || (strcasecmp(val, "YES") == 0)
            || (strcasecmp(val, "TRUE") == 0)) {
            ret = secs_var_set_str(var, "1");
            *(var->val_num) = 1;
      } else if ((strcasecmp(val, "OFF") == 0)
            || (strcasecmp(val, "0") == 0)
            || (strcasecmp(val, "NO") == 0)
            || (strcasecmp(val, "FALSE") == 0)) {
            ret = secs_var_set_str(var, "0");
            *(var->val_num) = 0;
      } else
            ret = 0;
      return(ret);
}

int   secs_var_set(secs_var_t *var, const char *val) {
      assert(var != NULL);
      assert(val != NULL);
      assert(var->set != NULL);
      return(var->set(var, val));
}

secs_var_t  *secs_var_find(secs_var_t *first, const char *name) {
      register secs_var_t     *var = first;

      assert(name != NULL);
      if (var == NULL)
            if ((var = secs_block_getroot()->variables) == NULL)
                  return(NULL);
      do {
            if (strcasecmp(var->name, name) == 0)
                  return(var);
      } while ((var = var->next) != NULL);
      return(NULL);
}

secs_var_t  *secs_var_find_n(secs_var_t *first, const char *name) {
      register secs_var_t     *var = first;

      assert(name != NULL);
      if (var == NULL)
            if ((var = secs_block_getroot()->variables) == NULL)
                  return(NULL);
      do {
            if (strncasecmp(var->name, name, strlen(var->name)) == 0)
                  return(var);
      } while ((var = var->next) != NULL);
      return(NULL);
}

secs_var_t  *secs_var_create(const char *const name,
      int (*varset)(secs_var_t *, const char *)) {
      secs_var_t  *var = NULL;
      size_t      slen = 0;

      assert(name != NULL);
      assert(varset != NULL);

      slen = strlen(name);
      var = secs_mem_alloc(sizeof(secs_var_t));
      var->name = secs_mem_alloc(slen+1);
      strncpy(var->name, name, slen+1);
      var->set = varset;
      var->val_str = &(var->_buf_str);
      var->_buf_str = NULL;
      var->val_num = &(var->_buf_num);
      var->_buf_num = 0;
      return(var);
}

int   secs_var_free(secs_var_t *var) {
      if (var == NULL)
            return(0);
      if (var->name != NULL) {
            secs_mem_free(var->name);
            var->name = NULL;
      }
      if (*(var->val_str) != NULL) {
            secs_mem_free(*(var->val_str));
            *(var->val_str) = NULL;
      }
      secs_mem_free(var);
      return(1);
}

Generated by  Doxygen 1.6.0   Back to index