Diff for /libelwix/src/vars.c between versions 1.1 and 1.3.2.1

version 1.1, 2013/01/17 10:05:35 version 1.3.2.1, 2013/05/26 20:03:19
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 145  vars2buffer(u_char * __restrict buf, int buflen, int b Line 145  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 222  buffer2vars(u_char * __restrict buf, int buflen, int v Line 222  buffer2vars(u_char * __restrict buf, int buflen, int v
                                 val->val_type = buffer;                                  val->val_type = buffer;
                         case buffer:                          case buffer:
                         case string:                          case string:
                                 if (AIT_LEN(val) > buflen - Limit) {  
                                         elwix_SetErr(EMSGSIZE, "Short buffer buflen=%d "  
                                                         "needed min %d", buflen, Limit + AIT_LEN(val));  
                                         if (!zcpy)  
                                                 array_Free(vars);  
                                         array_Destroy(&vars);  
                                         return NULL;  
                                 } else  
                                         Limit += AIT_LEN(val);  
   
                                 if (!zcpy) {                                  if (!zcpy) {
                                         val->val.buffer = e_malloc(AIT_LEN(val));                                          val->val.buffer = e_malloc(AIT_LEN(val));
                                         if (!val->val.buffer) {                                          if (!val->val.buffer) {
Line 268  buffer2vars(u_char * __restrict buf, int buflen, int v Line 258  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 284  ait_vars2buffer(u_char * __restrict buf, int buflen, a Line 274  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 300  ait_buffer2vars(u_char * __restrict buf, int buflen, i Line 290  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 316  ait_vars2map(u_char *buf, int buflen, array_t *vars) Line 306  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 331  ait_map2vars(u_char *buf, int buflen, int vnum, int zc Line 321  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 359  ait_allocVars(int varnum) Line 349  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 392  ait_getVars(array_t ** __restrict vars, int n) Line 382  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 414  ait_clrVars(array_t * __restrict vars) Line 404  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)
 {  {
         if (!vars || !*vars)          if (!vars || !*vars)
Line 431  ait_freeVars(array_t ** __restrict vars) Line 421  ait_freeVars(array_t ** __restrict vars)
  *   *
  * 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 452  ait_allocVar(void) Line 442  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 580  _cmp_arr_val_desc(const void *a, const void *b) Line 570  _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)
                 return;                  return;
   
         if (cmp)          if (cmp)
                qsort(vars->arr_data, vars->arr_num, sizeof(void*), cmp);                qsort(vars->arr_data, vars->arr_num, sizeof(uintptr_t), cmp);
         else if (order)          else if (order)
                qsort(vars->arr_data, vars->arr_num, sizeof(void*), _cmp_arr_val_desc);                qsort(vars->arr_data, vars->arr_num, sizeof(uintptr_t), _cmp_arr_val_desc);
         else          else
                qsort(vars->arr_data, vars->arr_num, sizeof(void*), _cmp_arr_val_asc);                qsort(vars->arr_data, vars->arr_num, sizeof(uintptr_t), _cmp_arr_val_asc);
 }  }
   
 /*  /*
Line 601  ait_sortVarsByVal(array_t * __restrict vars, int order Line 591  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)
                 return;                  return;
   
         if (order)          if (order)
                qsort(vars->arr_data, vars->arr_num, sizeof(void*), _cmp_arr_key_desc);                qsort(vars->arr_data, vars->arr_num, sizeof(uintptr_t), _cmp_arr_key_desc);
         else          else
                qsort(vars->arr_data, vars->arr_num, sizeof(void*), _cmp_arr_key_asc);                qsort(vars->arr_data, vars->arr_num, sizeof(uintptr_t), _cmp_arr_key_asc);
 }  }
   
 /*  /*
Line 634  ait_findKeyVars(array_t * __restrict vars, u_short key Line 624  ait_findKeyVars(array_t * __restrict vars, u_short key
         if (array_Copy(&tmp, vars) == -1)          if (array_Copy(&tmp, vars) == -1)
                 return NULL;                  return NULL;
         else          else
                qsort(tmp->arr_data, tmp->arr_num, sizeof(void*), _cmp_arr_key_asc);                qsort(tmp->arr_data, tmp->arr_num, sizeof(uintptr_t), _cmp_arr_key_asc);
   
         /* binary search */          /* binary search */
         for (p = (const u_char*) tmp->arr_data, i = array_Size(tmp); i; i >>= 1) {          for (p = (const u_char*) tmp->arr_data, i = array_Size(tmp); i; i >>= 1) {
                vv = (ait_val_t**) (p + (i >> 1) * sizeof(void*));                vv = (ait_val_t**) (p + (i >> 1) * sizeof(uintptr_t));
                 if (!(key - AIT_KEY(*vv))) {    /* found! */                  if (!(key - AIT_KEY(*vv))) {    /* found! */
                         v = *vv;                          v = *vv;
                         break;                          break;
                 }                  }
                 if ((key - AIT_KEY(*vv)) > 0) { /* move right key > current */                  if ((key - AIT_KEY(*vv)) > 0) { /* move right key > current */
                        p = (const u_char*) vv + sizeof(void*);                        p = (const u_char*) vv + sizeof(uintptr_t);
                         i--;                          i--;
                 }                               /* else move left */                  }                               /* else move left */
         }          }
Line 712  ait_hashVar(ait_val_t * __restrict v, const char * __r Line 702  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 733  ait_hashKeyVars(array_t * __restrict vars) Line 723  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 754  ait_findKeyHash(array_t * __restrict vars, const char  Line 744  ait_findKeyHash(array_t * __restrict vars, const char 
  * return: -1 error or >0 copied bytes to variable   * return: -1 error or >0 copied bytes to variable
  */   */
 int  int
io_sprintfVar(ait_val_t * __restrict v, const char *fmt, ...)ait_sprintfVar(ait_val_t * __restrict v, const char *fmt, ...)
 {  {
         int ret = 0;          int ret = 0;
         va_list lst;          va_list lst;
Line 787  io_sprintfVar(ait_val_t * __restrict v, const char *fm Line 777  io_sprintfVar(ait_val_t * __restrict v, const char *fm
  * @... = 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 822  ait_setlikeVar(ait_val_t * __restrict v, ait_type_t t, Line 812  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 838  ait_getlikeVar(ait_val_t * __restrict v) Line 828  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.1  
changed lines
  Added in v.1.3.2.1


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