--- libaitio/inc/aitio.h 2012/04/02 09:10:30 1.16.2.5 +++ libaitio/inc/aitio.h 2012/05/19 00:00:12 1.18 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.16.2.5 2012/04/02 09:10:30 misho Exp $ +* $Id: aitio.h,v 1.18 2012/05/19 00:00:12 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -74,6 +74,7 @@ typedef struct _tagSplitArray { } sarr_t; typedef struct _tagArray { + int arr_last; int arr_num; void **arr_data; } array_t; @@ -118,27 +119,27 @@ typedef struct { #define AIT_LEN(_vl) (_vl)->val_len #define AIT_KEY(_vl) (_vl)->val_key #define AIT_RAW(_vl) (_vl)->val.net -#define AIT_VOID(_vl) (_vl)->val.ptr -#define AIT_BLOB_CHUNKS(_vl, _n) (assert((_vl)), AIT_LEN((_vl)) / _n + (AIT_LEN((_vl)) % _n) ? 1 : 0) -#define AIT_ISEMPTY(_vl) (assert((_vl)), AIT_TYPE((_vl)) == empty) +#define AIT_ADDR(_vl) (_vl)->val.ptr +#define AIT_BLOB_CHUNKS(_vl, _n) (AIT_LEN((_vl)) / _n + (AIT_LEN((_vl)) % _n) ? 1 : 0) +#define AIT_ISEMPTY(_vl) (AIT_TYPE((_vl)) == empty) -#define AIT_GET_LIKE(_vl, _type) ((_type) ((_vl) ? (_vl)->val.ptr : NULL)) +#define AIT_GET_LIKE(_vl, _type) ((_type) AIT_ADDR((_vl))) -#define AIT_GET_PTR(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == ptr), (_vl)->val.ptr) -#define AIT_GET_DATA(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == data), (_vl)->val_data) -#define AIT_GET_BUF(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == buffer), (_vl)->val.buffer) -#define AIT_GET_STR(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == string), (_vl)->val.string) -#define AIT_GET_BLOB(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == blob), (_vl)->val.blob) -#define AIT_GET_U8(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == u8), (_vl)->val.u8) -#define AIT_GET_U16(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == u16), (_vl)->val.u16) -#define AIT_GET_U32(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == u32), (_vl)->val.u32) -#define AIT_GET_U64(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == u64), (_vl)->val.u64) -#define AIT_GET_I8(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == i8), (_vl)->val.i8) -#define AIT_GET_I16(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == i16), (_vl)->val.i16) -#define AIT_GET_I32(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == i32), (_vl)->val.i32) -#define AIT_GET_I64(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == i64), (_vl)->val.i64) -#define AIT_GET_F32(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == f32), (_vl)->val.f32) -#define AIT_GET_F64(_vl) (assert((_vl)), assert(AIT_TYPE((_vl)) == f64), (_vl)->val.f64) +#define AIT_GET_PTR(_vl) (assert(AIT_TYPE((_vl)) == ptr), (_vl)->val.ptr) +#define AIT_GET_DATA(_vl) (assert(AIT_TYPE((_vl)) == data), (_vl)->val_data) +#define AIT_GET_BUF(_vl) (assert(AIT_TYPE((_vl)) == buffer), (_vl)->val.buffer) +#define AIT_GET_STR(_vl) (assert(AIT_TYPE((_vl)) == string), (char*) (_vl)->val.string) +#define AIT_GET_BLOB(_vl) (assert(AIT_TYPE((_vl)) == blob), (_vl)->val.blob) +#define AIT_GET_U8(_vl) (assert(AIT_TYPE((_vl)) == u8), (_vl)->val.u8) +#define AIT_GET_U16(_vl) (assert(AIT_TYPE((_vl)) == u16), (_vl)->val.u16) +#define AIT_GET_U32(_vl) (assert(AIT_TYPE((_vl)) == u32), (_vl)->val.u32) +#define AIT_GET_U64(_vl) (assert(AIT_TYPE((_vl)) == u64), (_vl)->val.u64) +#define AIT_GET_I8(_vl) (assert(AIT_TYPE((_vl)) == i8), (_vl)->val.i8) +#define AIT_GET_I16(_vl) (assert(AIT_TYPE((_vl)) == i16), (_vl)->val.i16) +#define AIT_GET_I32(_vl) (assert(AIT_TYPE((_vl)) == i32), (_vl)->val.i32) +#define AIT_GET_I64(_vl) (assert(AIT_TYPE((_vl)) == i64), (_vl)->val.i64) +#define AIT_GET_F32(_vl) (assert(AIT_TYPE((_vl)) == f32), (_vl)->val.f32) +#define AIT_GET_F64(_vl) (assert(AIT_TYPE((_vl)) == f64), (_vl)->val.f64) #define AIT_SET_DATA(_vl, _p, _len) do { ait_val_t *__val = (_vl); \ __val = realloc(__val, sizeof(ait_val_t) + _len); \ @@ -152,13 +153,27 @@ typedef struct { #define AIT_SET_PTR(_vl, _p, _len) do { ait_val_t *__val = (_vl); assert(__val); \ __val->val_type = ptr; AIT_LEN(__val) = _len; \ __val->val.ptr = _p; } while (0) +#define AIT_RE_BUF(_vl, _len) do { ait_val_t *__val = (_vl); assert(__val); \ + void *__ptr = realloc(AIT_GET_BUF(__val), _len); \ + if (__ptr) { \ + __val->val.buffer = __ptr; AIT_LEN(__val) = _len; \ + } } while (0) +#define AIT_SET_BUF2(_vl, _c, _len) do { ait_val_t *__val = (_vl); assert(__val); \ + __val->val.buffer = malloc(_len); \ + if (__val->val.buffer) { \ + __val->val_type = buffer; AIT_LEN(__val) = _len; \ + memset(__val->val.buffer, _c, _len); \ + } } while (0) #define AIT_SET_BUF(_vl, _v, _len) do { ait_val_t *__val = (_vl); assert(__val); \ __val->val.buffer = malloc(_len); \ if (__val->val.buffer) { \ __val->val_type = buffer; AIT_LEN(__val) = _len; \ - memcpy(__val->val.buffer, (_v), _len); \ + if ((_v)) \ + memcpy(__val->val.buffer, (_v), _len); \ + else \ + memset(__val->val.buffer, 0, _len); \ } } while (0) -#define AIT_SET_STR(_vl, _v) do { ait_val_t *__val = (_vl); assert(__val); \ +#define AIT_SET_STR(_vl, _v) do { ait_val_t *__val = (_vl); assert(__val && (_v)); \ __val->val.string = (int8_t*) strdup((_v)); \ if (__val->val.string) { \ __val->val_type = string; \ @@ -213,6 +228,24 @@ typedef struct { __val->val_type = f64; __val->val.f64 = _n; \ AIT_LEN(__val) = sizeof(double); } while (0) +#define AIT_COPY_VAL(_vl, _v) do { memcpy((_vl), (_v), sizeof(ait_val_t)); \ + switch (AIT_TYPE((_vl))) { \ + case buffer: \ + AIT_SET_BUF((_vl), AIT_GET_BUF((_v)), AIT_LEN((_v))); \ + break; \ + case string: \ + AIT_SET_STR((_vl), AIT_GET_STR((_v))); \ + break; \ + default: \ + break; \ + } \ + } while (0) +#define AIT_COPY_VAL2(_vl, _v) do { AIT_COPY_VAL((_vl), (_v)); \ + if (AIT_TYPE((_vl)) == data) \ + AIT_SET_DATA((_vl), AIT_GET_DATA((_v)), AIT_LEN((_v))); \ + } while (0) + +#define AIT_INIT_VAL(_vl) (memset((_vl), 0, sizeof(ait_val_t))) /* if attribute zeroCopy is set not execute free() */ #define AIT_FREE_VAL(_vl) do { ait_val_t *__val = (_vl); assert(__val); \ switch (AIT_TYPE(__val)) { \ @@ -355,7 +388,7 @@ inline ait_val_t *io_allocVar(void); * @val = Variable * return: none */ -inline void io_freeVar(ait_val_t * __restrict val); +inline void io_freeVar(ait_val_t ** __restrict val); /* * io_allocVars() - Allocate ait_val_t array * @@ -378,6 +411,14 @@ inline int io_clrVars(array_t * __restrict vars); */ inline void io_freeVars(array_t ** __restrict vars); /* + * io_getVars() - Get ait_val_t element from array and if not exists allocate it + * + * @vars = Variable array + * @n = index of variable into array + * return: NULL error or !=NULL ait_val_t element + */ +inline ait_val_t *io_getVars(array_t ** __restrict vars, int n); +/* * io_sortVars() - Sorting array with variables * * @vars = Variable array @@ -557,7 +598,7 @@ inline char **io_arrayTo(array_t * __restrict arr); * io_arrayLen() - Get last used element in dynamic array (array Length) * * @arr = Array - * return: -1 error, 0 empty or >0 position of last used element + * return: -1 empty or >-1 position of last used element */ inline int io_arrayLen(array_t * __restrict arr); /* @@ -595,21 +636,25 @@ int io_arrayGrow(array_t * __restrict arr, int newNumI int io_arrayVacuum(array_t * __restrict arr, int fromWhere); #define io_arraySize(_arr) ((_arr) ? (_arr)->arr_num : 0) +#define io_arrayLast(_arr) (io_arraySize((_arr)) ? (_arr)->arr_last : -1) #define io_arrayZero(_arr) (assert((_arr)), memset((_arr)->arr_data, 0, \ io_arraySize((_arr)) * sizeof(void*))) -#define io_arrayGet(_arr, _d) (assert((_arr) && (_arr)->arr_num > _d), *((_arr)->arr_data + _d)) +#define io_arrayGet2(_arr, _d) (assert((_arr) && (_arr)->arr_num > _d), ((_arr)->arr_data + _d)) +#define io_arrayGet(_arr, _d) (assert((_arr) && (_arr)->arr_num > _d), (_arr)->arr_data[_d]) #define io_array(_arr, _d, _type) (assert((_arr) && (_arr)->arr_num > _d), \ - ((_type) *((_arr)->arr_data + _d))) + ((_type) (_arr)->arr_data[_d])) #define io_arraySet(_arr, _d, _ptr) do { \ assert((_arr) && (_arr)->arr_num > _d); \ - *((_arr)->arr_data + _d) = (void*) (_ptr); \ + if ((_arr)->arr_last < _d) \ + (_arr)->arr_last = _d; \ + (_arr)->arr_data[_d] = (void*) (_ptr); \ } while (0) #define io_arrayDel(_arr, _d, _fri) do { \ assert((_arr) && (_arr)->arr_num > _d); \ - if (_fri) \ - free(*((_arr)->arr_data + _d)); \ - *((_arr)->arr_data + _d) = NULL; \ + if (_fri && (_arr)->arr_data[_d]) \ + free((_arr)->arr_data[_d]); \ + (_arr)->arr_data[_d] = NULL; \ } while (0) /* @@ -626,9 +671,10 @@ inline void *io_arrayElem(array_t * __restrict arr, in * * @arr = Array * @data = Element, if set NULL return only first empty position + * @mayGrow = Array may to grow, if not enough room for new element * return: -1 not found empty position, array is full!, >-1 return position of stored element into array */ -inline int io_arrayPush(array_t * __restrict arr, void **data); +inline int io_arrayPush(array_t * __restrict arr, void **data, int mayGrow); /* * io_arrayPop() - Pop element from dynamic array like stack manner, last used position *