Diff for /libelwix/src/vars.c between versions 1.3 and 1.8.4.1

version 1.3, 2013/03/07 23:04:48 version 1.8.4.1, 2016/05/14 11:31:38
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013Copyright 2004 - 2015
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 46  SUCH DAMAGE. Line 46  SUCH DAMAGE.
 #include "global.h"  #include "global.h"
   
   
static intstatic inline int
 vars2buffer(u_char * __restrict buf, int buflen, int be, array_t * __restrict vars)  vars2buffer(u_char * __restrict buf, int buflen, int be, array_t * __restrict vars)
 {  {
         int Limit = 0;          int Limit = 0;
Line 123  vars2buffer(u_char * __restrict buf, int buflen, int b Line 123  vars2buffer(u_char * __restrict buf, int buflen, int b
                                 break;                                  break;
                         case buffer:                          case buffer:
                         case string:                          case string:
                           case ptr:
                                 if (AIT_LEN(val) > buflen - Limit) {                                  if (AIT_LEN(val) > buflen - Limit) {
                                         elwix_SetErr(EMSGSIZE, "Short buffer buflen=%d "                                          elwix_SetErr(EMSGSIZE, "Short buffer buflen=%d "
                                                         "needed min %d", buflen, Limit + AIT_LEN(val));                                                          "needed min %d", buflen, Limit + AIT_LEN(val));
Line 145  vars2buffer(u_char * __restrict buf, int buflen, int b Line 146  vars2buffer(u_char * __restrict buf, int buflen, int b
         return Limit;          return Limit;
 }  }
   
static array_t *static inline array_t *
 buffer2vars(u_char * __restrict buf, int buflen, int vnum, int zcpy)  buffer2vars(u_char * __restrict buf, int buflen, int vnum, int zcpy)
 {  {
         array_t *vars;          array_t *vars;
Line 218  buffer2vars(u_char * __restrict buf, int buflen, int v Line 219  buffer2vars(u_char * __restrict buf, int buflen, int v
                                         val->val.net = le64toh(v[i].val.net);                                          val->val.net = le64toh(v[i].val.net);
                                 break;                                  break;
                         case data:                          case data:
                                /* WARNING:: remap data type to buffer */                        case ptr:
                                 /* WARNING:: remap data and ptr type to buffer! */
                                 val->val_type = buffer;                                  val->val_type = buffer;
                         case buffer:                          case buffer:
                         case string:                          case string:
Line 258  buffer2vars(u_char * __restrict buf, int buflen, int v Line 260  buffer2vars(u_char * __restrict buf, int buflen, int v
  * @vars = Variable array   * @vars = Variable array
  * return: -1 error, 0 nothing done or >0 size of marshaled data   * return: -1 error, 0 nothing done or >0 size of marshaled data
  */   */
inline intint
 ait_vars2buffer(u_char * __restrict buf, int buflen, array_t * __restrict vars)  ait_vars2buffer(u_char * __restrict buf, int buflen, array_t * __restrict vars)
 {  {
         return vars2buffer(buf, buflen, 42, vars);          return vars2buffer(buf, buflen, 42, vars);
Line 274  ait_vars2buffer(u_char * __restrict buf, int buflen, a Line 276  ait_vars2buffer(u_char * __restrict buf, int buflen, a
                 *DON'T MODIFY OR DESTROY BUFFER*. =0 call array_Free() before array_Destroy()                  *DON'T MODIFY OR DESTROY BUFFER*. =0 call array_Free() before array_Destroy()
  * return: =NULL error, !=NULL allocated variable array, after use must free with array_Destroy()   * return: =NULL error, !=NULL allocated variable array, after use must free with array_Destroy()
  */   */
inline array_t *array_t *
 ait_buffer2vars(u_char * __restrict buf, int buflen, int vnum, int zcpy)  ait_buffer2vars(u_char * __restrict buf, int buflen, int vnum, int zcpy)
 {  {
         return buffer2vars(buf, buflen, vnum, zcpy);          return buffer2vars(buf, buflen, vnum, zcpy);
Line 290  ait_buffer2vars(u_char * __restrict buf, int buflen, i Line 292  ait_buffer2vars(u_char * __restrict buf, int buflen, i
  * @vars = Variable array   * @vars = Variable array
  * return: -1 error, 0 nothing done or >0 size of marshaled data   * return: -1 error, 0 nothing done or >0 size of marshaled data
  */   */
inline intint
 ait_vars2map(u_char *buf, int buflen, array_t *vars)  ait_vars2map(u_char *buf, int buflen, array_t *vars)
 {  {
         return vars2buffer(buf, buflen, 0, vars);          return vars2buffer(buf, buflen, 0, vars);
Line 306  ait_vars2map(u_char *buf, int buflen, array_t *vars) Line 308  ait_vars2map(u_char *buf, int buflen, array_t *vars)
                 *DON'T MODIFY OR DESTROY BUFFER*. =0 call array_Free() before array_Destroy()                  *DON'T MODIFY OR DESTROY BUFFER*. =0 call array_Free() before array_Destroy()
  * return: =NULL error, !=NULL allocated variable array, after use must free with array_Destroy()   * return: =NULL error, !=NULL allocated variable array, after use must free with array_Destroy()
  */   */
inline array_t *array_t *
 ait_map2vars(u_char *buf, int buflen, int vnum, int zcpy)  ait_map2vars(u_char *buf, int buflen, int vnum, int zcpy)
 {  {
         return buffer2vars(buf, buflen, vnum, zcpy);          return buffer2vars(buf, buflen, vnum, zcpy);
Line 321  ait_map2vars(u_char *buf, int buflen, int vnum, int zc Line 323  ait_map2vars(u_char *buf, int buflen, int vnum, int zc
  * @varnum = Number of variables   * @varnum = Number of variables
  * return: =NULL error or !=NULL allocated array   * return: =NULL error or !=NULL allocated array
  */   */
inline array_t *array_t *
 ait_allocVars(int varnum)  ait_allocVars(int varnum)
 {  {
         array_t *arr;          array_t *arr;
Line 349  ait_allocVars(int varnum) Line 351  ait_allocVars(int varnum)
  * @n = index of variable into array   * @n = index of variable into array
  * return: NULL error or !=NULL ait_val_t element   * return: NULL error or !=NULL ait_val_t element
  */   */
inline ait_val_t *ait_val_t *
 ait_getVars(array_t ** __restrict vars, int n)  ait_getVars(array_t ** __restrict vars, int n)
 {  {
         register int i;          register int i;
Line 382  ait_getVars(array_t ** __restrict vars, int n) Line 384  ait_getVars(array_t ** __restrict vars, int n)
  * @vars = Variable array   * @vars = Variable array
  * return: -1 error or size of array   * return: -1 error or size of array
  */   */
inline intint
 ait_clrVars(array_t * __restrict vars)  ait_clrVars(array_t * __restrict vars)
 {  {
         register int i;          register int i;
Line 404  ait_clrVars(array_t * __restrict vars) Line 406  ait_clrVars(array_t * __restrict vars)
  * @vars = Variable array   * @vars = Variable array
  * return: none   * return: none
  */   */
inline voidvoid
 ait_freeVars(array_t ** __restrict vars)  ait_freeVars(array_t ** __restrict vars)
 {  {
           register int i;
           ait_val_t *v;
   
         if (!vars || !*vars)          if (!vars || !*vars)
                 return;                  return;
   
        ait_clrVars(*vars);        for (i = 0; i < array_Size(*vars); i++)
        array_Free(*vars);                if ((v = array(*vars, i, ait_val_t*))) {
                         /* free memory if isn't zero copy */
                         if (!AIT_IN(v)) {
                                 AIT_FREE_VAL(v);
                                 if ((*vars)->arr_data[i])
                                         e_free((*vars)->arr_data[i]);
                         } else
                                 AIT_FREE_VAL(v);
                         (*vars)->arr_data[i] = NULL;
                 }
         (*vars)->arr_last = -1;
 
         array_Destroy(vars);          array_Destroy(vars);
 }  }
   
   /*
    * ait_resideVars() - Calculate footprint of resided variables into array
    *
    * @vars = Variable array
    * return: bytes for whole array
    */
   size_t
   ait_resideVars(array_t * __restrict vars)
   {
           size_t ret = 0;
           register int i;
   
           if (vars) {
                   ret = array_Size(vars) * sizeof(ait_val_t);
                   for (i = 0; i < array_Size(vars); i++)
                           switch (AIT_TYPE(array(vars, i, ait_val_t*))) {
                                   case buffer:
                                   case string:
                                   case data:
                                   case ptr:
                                           ret += AIT_LEN(array(vars, i, ait_val_t*));
                                           break;
                                   default:
                                           break;
                           }
           }
   
           return ret;
   }
   
   
 /*  /*
  * ait_allocVar() - Allocate memory for variable   * ait_allocVar() - Allocate memory for variable
  *   *
  * return: NULL error or new variable, after use free variable with ait_freeVar()   * return: NULL error or new variable, after use free variable with ait_freeVar()
  */   */
inline ait_val_t *ait_val_t *
 ait_allocVar(void)  ait_allocVar(void)
 {  {
         ait_val_t *v = NULL;          ait_val_t *v = NULL;
Line 442  ait_allocVar(void) Line 488  ait_allocVar(void)
  * @val = Variable   * @val = Variable
  * return: none   * return: none
  */   */
inline voidvoid
 ait_freeVar(ait_val_t ** __restrict val)  ait_freeVar(ait_val_t ** __restrict val)
 {  {
         if (val && *val) {          if (val && *val) {
Line 570  _cmp_arr_val_desc(const void *a, const void *b) Line 616  _cmp_arr_val_desc(const void *a, const void *b)
  * @cmp = Custom compare function for sorting. If =NULL compare by value   * @cmp = Custom compare function for sorting. If =NULL compare by value
  * return: none   * return: none
  */   */
inline voidvoid
 ait_sortVarsByVal(array_t * __restrict vars, int order,  int (*cmp)(const void*, const void*))  ait_sortVarsByVal(array_t * __restrict vars, int order,  int (*cmp)(const void*, const void*))
 {  {
         if (!vars)          if (!vars)
Line 591  ait_sortVarsByVal(array_t * __restrict vars, int order Line 637  ait_sortVarsByVal(array_t * __restrict vars, int order
  * @order = Sort order. If =0 ascend or !=0 descend   * @order = Sort order. If =0 ascend or !=0 descend
  * return: none   * return: none
  */   */
inline voidvoid
 ait_sortVarsByKey(array_t * __restrict vars, int order)  ait_sortVarsByKey(array_t * __restrict vars, int order)
 {  {
         if (!vars)          if (!vars)
Line 702  ait_hashVar(ait_val_t * __restrict v, const char * __r Line 748  ait_hashVar(ait_val_t * __restrict v, const char * __r
  * @vars = Variables   * @vars = Variables
  * return -1 error or 0 ok   * return -1 error or 0 ok
  */   */
inline intint
 ait_hashKeyVars(array_t * __restrict vars)  ait_hashKeyVars(array_t * __restrict vars)
 {  {
         register int i;          register int i;
Line 723  ait_hashKeyVars(array_t * __restrict vars) Line 769  ait_hashKeyVars(array_t * __restrict vars)
  * @key = Search string   * @key = Search string
  * return: NULL error or not found, !=NULL valid element   * return: NULL error or not found, !=NULL valid element
  */   */
inline ait_val_t *ait_val_t *
 ait_findKeyHash(array_t * __restrict vars, const char * __restrict key)  ait_findKeyHash(array_t * __restrict vars, const char * __restrict key)
 {  {
         u_short k = 0;          u_short k = 0;
Line 748  ait_sprintfVar(ait_val_t * __restrict v, const char *f Line 794  ait_sprintfVar(ait_val_t * __restrict v, const char *f
 {  {
         int ret = 0;          int ret = 0;
         va_list lst;          va_list lst;
        char *str = NULL;        char str[STRSIZ] = { [0 ... STRSIZ - 1] = 0 };
   
         if (!v || !fmt)          if (!v || !fmt)
                 return -1;                  return -1;
   
         va_start(lst, fmt);          va_start(lst, fmt);
        ret = vasprintf(&str, fmt, lst);        ret = vsnprintf(str, sizeof str - 1, fmt, lst);
         va_end(lst);          va_end(lst);
   
        if (str && ret > -1) {        if (ret > -1) {
                 AIT_FREE_VAL(v);                  AIT_FREE_VAL(v);
                 AIT_SET_STR(v, str);                  AIT_SET_STR(v, str);
         } else          } else
                 LOGERR;                  LOGERR;
   
         if (str)  
                 free(str);  
         return ret;          return ret;
 }  }
   
Line 777  ait_sprintfVar(ait_val_t * __restrict v, const char *f Line 821  ait_sprintfVar(ait_val_t * __restrict v, const char *f
  * @... = data   * @... = data
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline intint
 ait_setlikeVar(ait_val_t * __restrict v, ait_type_t t, u_int l, ...)  ait_setlikeVar(ait_val_t * __restrict v, ait_type_t t, u_int l, ...)
 {  {
         va_list lst;          va_list lst;
Line 812  ait_setlikeVar(ait_val_t * __restrict v, ait_type_t t, Line 856  ait_setlikeVar(ait_val_t * __restrict v, ait_type_t t,
  * @v = variable   * @v = variable
  * return: return raw data   * return: return raw data
  */   */
inline uint64_tuint64_t
 ait_getlikeVar(ait_val_t * __restrict v)  ait_getlikeVar(ait_val_t * __restrict v)
 {  {
         if (!v)          if (!v)
Line 828  ait_getlikeVar(ait_val_t * __restrict v) Line 872  ait_getlikeVar(ait_val_t * __restrict v)
  * @b = 2nd variable   * @b = 2nd variable
  * return: 0 is equal or !=0 is different   * return: 0 is equal or !=0 is different
  */   */
inline intint
 ait_cmpVar(ait_val_t * __restrict a, ait_val_t * __restrict b)  ait_cmpVar(ait_val_t * __restrict a, ait_val_t * __restrict b)
 {  {
         intptr_t ret;          intptr_t ret;

Removed from v.1.3  
changed lines
  Added in v.1.8.4.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>