--- libaitio/inc/aitio.h 2011/06/07 11:49:39 1.10 +++ libaitio/inc/aitio.h 2011/08/29 12:00:57 1.11 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.10 2011/06/07 11:49:39 misho Exp $ +* $Id: aitio.h,v 1.11 2011/08/29 12:00:57 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -233,15 +233,15 @@ inline void io_arrayDestroy(array_t ** __restrict parr inline void io_arrayFree(array_t * __restrict arr); /* * io_arrayFrom() - Create and fill array from array with pointers - * @argv = Array with pointers + * @pargv = Array with pointers * @argc = Number of Items, if 0 walk through argv and stop when reach NULL item - * return: NULL error, != NULL allocated memory for array + * return: NULL error, != NULL allocated new array */ -inline array_t *io_arrayFrom(const char **argv, int argc); +inline array_t *io_arrayFrom(const char *** __restrict pargv, int argc); /* * io_arrayTo() - Create and fill array with pointers from dynamic array * @arr = Array - * return: NULL error, != NULL allocated memory for array + * return: NULL error, != NULL allocated memory for array, NULL terminated */ inline char **io_arrayTo(array_t * __restrict arr); /* @@ -272,17 +272,20 @@ int io_arrayGrow(array_t * __restrict arr, int newNumI */ int io_arrayVacuum(array_t * __restrict arr, int fromWhere); -#define io_arraySize(_arr) ((assert(_arr)), _arr->arr_num) +#define io_arraySize(_arr) (assert((_arr)), (_arr)->arr_num) -#define io_arrayGet(_arr, _d, _type) ((assert(_arr && _arr->arr_num > _d)), \ - ((_type) *(_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))) #define io_arraySet(_arr, _d, _ptr) do { \ - assert(_arr && _arr->arr_num > _d); \ - *(_arr->arr_data + _d) = (void*) _ptr; \ + assert((_arr) && (_arr)->arr_num > _d); \ + *((_arr)->arr_data + _d) = (void*) (_ptr); \ } while (0) -#define io_arrayDel(_arr, _d) do { \ - assert(_arr && _arr->arr_num > _d); \ - *(_arr->arr_data + _d) = NULL; \ +#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; \ } while (0) /* @@ -295,7 +298,7 @@ inline int io_arrayPush(array_t * __restrict arr, void /* * io_arrayPop() - Pop element from dynamic array like stack manner, last used position * @arr = Array - * @data = Element, if set NULL return only first empty position + * @data = Element, if set NULL return only last used position * @delAfter = Delete after Pop element, !=0 delete element from array after return data * return: -1 not found used position, array is empty!, >-1 return element position */ @@ -360,7 +363,7 @@ int io_sarrGrow(sarr_t * __restrict arr, int newNumIte * return: -1 error, >-1 freed segments */ inline int io_sarrVacuum(sarr_t * __restrict arr); -#define io_sarrSize(_arr) ((assert(_arr)), _arr->sarr_num) +#define io_sarrSize(_arr) (assert((_arr)), (_arr)->sarr_num) /* * io_sarrGet() - Get element from dynamic split-order array * @arr = Array @@ -384,8 +387,23 @@ void *io_sarrGet2(sarr_t * __restrict arr, unsigned in * return: NULL error or empty, !=NULL old value in element */ inline void *io_sarrSet(sarr_t * __restrict arr, unsigned int idx, void *data); -#define io_sarrDel(_arr, _idx) io_sarrSet(_arr, _idx, NULL) -#define io_sarr(_arr, _idx, _type) (_type)io_sarrGet(_arr, _idx) +#define io_sarrDel(_arr, _idx) io_sarrSet((_arr), _idx, NULL) +#define io_sarr(_arr, _idx, _type) (_type)io_sarrGet((_arr), _idx) +/* + * io_sarr2array() - Convert from split-order array to dynamic array + * @sa = split array + * @sarrFree = after convert split array !=0 will be destroyed sarray + * return: NULL error or != NULL new array + */ +array_t *io_sarr2array(sarr_t ** __restrict sa, int sarrFree); +/* + * io_array2sarr() - Convert from dynamic array to split-order array + * @a = array + * @segLen = Length of segment + * @arrFree = after convert array !=0 will be destroyed + * return: NULL error or != NULL new sarr + */ +sarr_t *io_array2sarr(array_t ** __restrict a, int segLen, int arrFree); /* * io_CopyEnv() Copy environment to new environment array; @@ -494,7 +512,7 @@ extern int io_Debug; #define ioDEBUG(x, fmt, ...) do { \ assert((fmt)); \ char str[STRSIZ] = { 0 }; \ - snprintf(str, STRSIZ, (fmt), ##__VA_ARGS__); \ + snprintf(str, sizeof str, (fmt), ##__VA_ARGS__); \ if ((x) <= io_Debug) \ syslog(LOG_DEBUG, "ioDebug(%d):%s(%d): %s\n", \ (x), __func__, __LINE__, str); \ @@ -503,7 +521,7 @@ extern int io_Debug; #define ioERROR(x, fmt, ...) do { \ assert((fmt)); \ char str[STRSIZ] = { 0 }; \ - snprintf(str, STRSIZ, (fmt), ##__VA_ARGS__); \ + snprintf(str, sizeof str, (fmt), ##__VA_ARGS__); \ syslog(LOG_ERR, "ioError():%s(%d): #%d - %s\n", \ __func__, __LINE__, (x), str); \ } while (0)