--- libaitio/inc/aitio.h 2011/04/20 22:56:32 1.8 +++ libaitio/inc/aitio.h 2011/06/07 11:49:39 1.10 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.8 2011/04/20 22:56:32 misho Exp $ +* $Id: aitio.h,v 1.10 2011/06/07 11:49:39 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -55,6 +55,14 @@ SUCH DAMAGE. #define VACUUM_BETWEEN 2 +typedef void ** sarr_seg_t; +typedef struct _tagSplitArray { + int sarr_num; + int sarr_seg; + int sarr_siz; + sarr_seg_t *sarr_data; +} sarr_t; + typedef struct _tagArray { int arr_num; void **arr_data; @@ -211,25 +219,45 @@ inline char *io_Hex2Ch(unsigned char *psLine, int line */ inline array_t *io_arrayInit(int numItems); /* - * io_arrayDestroy() - Free all data in dynamic array and Destroy dynamic array + * io_arrayDestroy() - Free and destroy dynamic array * @parr = Array * return: none */ inline void io_arrayDestroy(array_t ** __restrict parr); /* - * io_arrayFree() - Free all data in dynamic array + * io_arrayFree() - Free all data in dynamic array items * (WARNING! If assign static array dont use this!!!) * @arr = Array * return: none */ inline void io_arrayFree(array_t * __restrict arr); /* + * io_arrayFrom() - Create and fill array from array with pointers + * @argv = 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 + */ +inline array_t *io_arrayFrom(const char **argv, int argc); +/* + * io_arrayTo() - Create and fill array with pointers from dynamic array + * @arr = Array + * return: NULL error, != NULL allocated memory for array + */ +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 */ inline int io_arrayLen(array_t * __restrict arr); /* + * io_arrayConcat() Concat source array to destination array + * @dest = Destination array + * @src = Source array + * return: -1 error; >0 new count of destination array + */ +int io_arrayConcat(array_t * __restrict dest, array_t * __restrict src); +/* * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!! * @arr = Array * @newNumItems = Number of Items @@ -252,6 +280,10 @@ int io_arrayVacuum(array_t * __restrict arr, int fromW 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; \ + } while (0) /* * io_arrayPush() - Push element into dynamic array like stack manner, place at first empty position @@ -302,6 +334,78 @@ int io_arrayMake(char * __restrict psArgs, int nargs, int io_MakeAV(const char * __restrict csArgs, const char *csDelim, char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen); +/* + * io_sarrInit() - Create and initialize dynamic split-order array + * @numItems = Number of Items + * @segLen = Length of segment + * return: NULL error, != NULL allocated memory for array + */ +inline sarr_t *io_sarrInit(int numItems, int segLen); +/* + * io_sarrDestroy() - Free all data in dynamic split-order array and Destroy array + * @parr = Array + * return: none + */ +inline void io_sarrDestroy(sarr_t ** __restrict parr); +/* + * io_sarrGrow() - Grow/Shrink dynamic split-order array, Use with care when it shrink!!! + * @arr = Array + * @newNumItems = Number of Items + * return: -1 error, 0 ok + */ +int io_sarrGrow(sarr_t * __restrict arr, int newNumItems); +/* + * io_sarrVacuum() - Vacuum dynamic split-order array, empty segments will be freed + * @arr = Array + * return: -1 error, >-1 freed segments + */ +inline int io_sarrVacuum(sarr_t * __restrict arr); +#define io_sarrSize(_arr) ((assert(_arr)), _arr->sarr_num) +/* + * io_sarrGet() - Get element from dynamic split-order array + * @arr = Array + * @idx = Index (warning 1st element is at position 1) + * return: NULL not found, !=NULL element + */ +inline void *io_sarrGet(sarr_t * __restrict arr, unsigned int idx); +/* + * io_sarrGet2() - Always get element from dynamic split-order array + * Function automatic grow array. Good use for Hash tables! + * @arr = Array + * @idx = Index (warning 1st element is at position 1) + * return: NULL not found, !=NULL element + */ +void *io_sarrGet2(sarr_t * __restrict arr, unsigned int idx); +/* + * io_sarrSet() - Set element to dynamic split-order array + * @arr = Array + * @idx = Index (warning 1st element is at position 1) + * @data = Value + * 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) + +/* + * io_CopyEnv() Copy environment to new environment array; + * @oldenv = Environment array + * return: NULL error; !=NULL Allocated new environment array(must be free) +*/ +char **io_CopyEnv(const char **oldenv); +/* + * io_ExecArgs() Build exec arguments from other array + * @psProg = Program name for execute + * @oldarg = Arguments array + * return: NULL error; !=NULL Allocated execution array(must be free) +*/ +char **io_ExecArgs(const char *psProg, const char **oldarg); +/* + * io_FreeNullTerm() Free dynamic allocated null terminated array with strings + * @arr = Pointer to array for free + * return: none +*/ +inline void io_FreeNullTerm(char *** __restrict arr); /* * ioURLGet() Parse and get data from input URL