--- libaitio/src/Attic/array.c 2011/08/31 12:29:32 1.4.2.1 +++ libaitio/src/Attic/array.c 2012/08/01 00:37:08 1.11 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: array.c,v 1.4.2.1 2011/08/31 12:29:32 misho Exp $ +* $Id: array.c,v 1.11 2012/08/01 00:37:08 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -48,6 +48,7 @@ SUCH DAMAGE. /* * io_arrayInit() - Create and initialize dynamic array + * * @numItems = Number of Items * return: NULL error, != NULL allocated memory for array */ @@ -56,17 +57,18 @@ io_arrayInit(int numItems) { array_t *arr = NULL; - arr = malloc(sizeof(array_t)); + arr = io_malloc(sizeof(array_t)); if (!arr) { LOGERR; return NULL; } + arr->arr_last = -1; arr->arr_num = numItems; - arr->arr_data = calloc(io_arraySize(arr), sizeof(void*)); + arr->arr_data = io_calloc(io_arraySize(arr), sizeof(void*)); if (!arr->arr_data) { LOGERR; - free(arr); + io_free(arr); return NULL; } else io_arrayZero(arr); @@ -76,6 +78,7 @@ io_arrayInit(int numItems) /* * io_arrayFrom() - Create and fill array from 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 new array @@ -96,26 +99,29 @@ io_arrayFrom(const char *** __restrict pargv, int argc else for (a = *pargv; *a; a++, num++); - arr = malloc(sizeof(array_t)); + arr = io_malloc(sizeof(array_t)); if (!arr) { LOGERR; return NULL; } arr->arr_num = num; - arr->arr_data = calloc(io_arraySize(arr), sizeof(void*)); + arr->arr_data = io_calloc(io_arraySize(arr), sizeof(void*)); if (!arr->arr_data) { LOGERR; - free(arr); + io_free(arr); return NULL; - } else + } else { memcpy(arr->arr_data, *pargv, io_arraySize(arr) * sizeof(void*)); + arr->arr_last = io_arraySize(arr) - 1; + } return arr; } /* * io_arrayTo() - Create and fill array with pointers from dynamic array + * * @arr = Array * return: NULL error, != NULL allocated memory for array, NULL terminated */ @@ -128,7 +134,7 @@ io_arrayTo(array_t * __restrict arr) if (!arr || !io_arraySize(arr)) return NULL; - args = (char **) calloc(io_arraySize(arr) + 1, sizeof(char*)); + args = (char **) io_calloc(io_arraySize(arr) + 1, sizeof(char*)); if (!args) { LOGERR; return NULL; @@ -142,6 +148,7 @@ io_arrayTo(array_t * __restrict arr) /* * io_arrayFree() - Free all data in dynamic array items * (WARNING! If assign static array dont use this!!!) + * * @arr = Array * return: none */ @@ -155,13 +162,16 @@ io_arrayFree(array_t * __restrict arr) for (i = 0; i < io_arraySize(arr); i++) if (arr->arr_data[i]) { - free(arr->arr_data[i]); + io_free(arr->arr_data[i]); arr->arr_data[i] = NULL; } + + arr->arr_last = -1; } /* * io_arrayDestroy() - Free and destroy dynamic array + * * @parr = Array * return: none */ @@ -172,15 +182,16 @@ io_arrayDestroy(array_t ** __restrict parr) return; if ((*parr)->arr_data) - free((*parr)->arr_data); - free(*parr); + io_free((*parr)->arr_data); + io_free(*parr); *parr = NULL; } /* * 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) @@ -193,11 +204,12 @@ io_arrayLen(array_t * __restrict arr) for (i = io_arraySize(arr); i && !arr->arr_data[i - 1]; i--); - return i; + return --i; } /* * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!! + * * @arr = Array * @newNumItems = Number of Items * @freeShrink = Free elements before shrink array @@ -210,7 +222,6 @@ io_arrayGrow(array_t * __restrict arr, int newNumItems int n = 0; register int i; - assert(arr); if (!arr) return -1; @@ -221,11 +232,11 @@ io_arrayGrow(array_t * __restrict arr, int newNumItems } else if (freeShrink) for (i = newNumItems; i < arr->arr_num; i++) if (arr->arr_data[i]) - free(arr->arr_data[i]); + io_free(arr->arr_data[i]); arr->arr_num = newNumItems; if (io_arraySize(arr)) { - data = realloc(arr->arr_data, io_arraySize(arr) * sizeof(void*)); + data = io_realloc(arr->arr_data, io_arraySize(arr) * sizeof(void*)); if (!data) { LOGERR; return -1; @@ -233,10 +244,12 @@ io_arrayGrow(array_t * __restrict arr, int newNumItems arr->arr_data = data; memset(arr->arr_data + (io_arraySize(arr) - n), 0, n * sizeof(void*)); + arr->arr_last = io_arrayLen(arr); } else { if (arr->arr_data) - free(arr->arr_data); + io_free(arr->arr_data); arr->arr_data = NULL; + arr->arr_last = -1; } return 0; @@ -244,6 +257,7 @@ io_arrayGrow(array_t * __restrict arr, int newNumItems /* * io_arrayVacuum() - Vacuum dynamic array, empty elements will be deleted + * * @arr = Array * @fromWhere = 1 begin, 2 ALL empty elements * return: -1 error, 0 ok @@ -254,7 +268,6 @@ io_arrayVacuum(array_t * __restrict arr, int fromWhere register int i, j, num; int cx = 0; - assert(arr); if (!arr) return -1; else @@ -292,23 +305,63 @@ io_arrayVacuum(array_t * __restrict arr, int fromWhere } } + arr->arr_last = io_arrayLen(arr); return cx; } /* + * io_arrayElem() - Always GET/PUT element into dynamic array, if not enough elements grow array + * + * @arr = Array + * @n = Position + * @data = Element, if set NULL GET element at position or !=NULL PUT element at position + * return: -1 error or !=-1 return element at position + */ +inline void * +io_arrayElem(array_t * __restrict arr, int n, void *data) +{ + void *dat = NULL; + + if (!arr) + return (void*) -1; + + if (n >= io_arraySize(arr) && io_arrayGrow(arr, n + 1, 0)) + return (void*) -1; + + dat = io_arrayGet(arr, n); + if (data) + io_arraySet(arr, n, data); + + return dat; +} + +/* * io_arrayPush() - Push element into dynamic array like stack manner, place at first empty position + * * @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) +io_arrayPush(array_t * __restrict arr, void **data, int mayGrow) { +#if 0 register int i; +#endif int ret = -1; - assert(arr); + if (!arr) + return -1; + else + ret = io_arrayLast(arr) + 1; + if (!mayGrow && ret >= io_arraySize(arr)) + return -1; + if (mayGrow && ret >= io_arraySize(arr) && + io_arrayGrow(arr, ret + 1, 0)) + return -1; +#if 0 for (i = 0; i < io_arraySize(arr); i++) if (!arr->arr_data[i]) { if (data) @@ -316,12 +369,15 @@ io_arrayPush(array_t * __restrict arr, void **data) ret = i; break; } +#endif + arr->arr_data[++arr->arr_last] = *data; return ret; } /* * io_arrayPop() - Pop element from dynamic array like stack manner, last used position + * * @arr = Array * @data = Element, if set NULL return only last used position * @delAfter = Delete after Pop element, !=0 delete element from array after return data @@ -330,11 +386,15 @@ io_arrayPush(array_t * __restrict arr, void **data) inline int io_arrayPop(array_t * __restrict arr, void ** __restrict data, int delAfter) { +#if 0 register int i; +#endif int ret = -1; - assert(arr); + if (!arr) + return -1; +#if 0 for (i = io_arraySize(arr) - 1; i >= 0; i--) if (arr->arr_data[i]) { if (data) @@ -344,12 +404,20 @@ io_arrayPop(array_t * __restrict arr, void ** __restri ret = i; break; } +#endif + ret = io_arrayLast(arr); + if (data) + *data = arr->arr_data[ret]; + if (delAfter) + arr->arr_data[arr->arr_last--] = NULL; + return ret; } /* * io_arrayConcat() Concat source array to destination array + * * @dest = Destination array * @src = Source array * return: -1 error; >0 new count of destination array @@ -369,33 +437,39 @@ io_arrayConcat(array_t * __restrict dest, array_t * __ return -1; memcpy(dest->arr_data + n, src->arr_data, io_arraySize(src) * sizeof(void*)); + dest->arr_last = io_arrayLen(dest); return io_arraySize(dest); } /* - * io_argsNum() Parse and calculate number of arguments - * @csArgs = Input arguments line - * @csDelim = Delimiter(s) for separate - * return: 0 error format; -1 error:: can`t read; >0 ok, number of items + * io_arrayCopy() Copy source array to destination array + * + * @dest = Destination array, after use free with io_arrayDestroy() + * @src = Source array + * return: -1 error; >0 count of destination array */ -inline int -io_argsNum(const char *csArgs, const char *csDelim) +int +io_arrayCopy(array_t ** __restrict dest, array_t * __restrict src) { - register int res; - char *pos; + assert(dest); + assert(src); + if (!dest || !src) + return -1; - assert(csArgs); - assert(csDelim); - if (!csArgs || !csDelim) + *dest = io_arrayInit(io_arraySize(src)); + if (!*dest) return -1; + else + (*dest)->arr_last = src->arr_last; - for (res = 1, pos = (char*) csArgs; (pos = strpbrk(pos, csDelim)); res++, pos++); - return res; + memcpy((*dest)->arr_data, src->arr_data, io_arraySize(*dest) * sizeof(void*)); + return io_arraySize(*dest); } /* * io_arrayMake() Parse and make array from arguments ... (input string will be modified!!! * and output array must be free with io_arrayDestroy() after use!) + * * @psArgs = Input arguments line, after execute string is modified!!! * @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs * @csDelim = Delimiter(s) for separate @@ -428,49 +502,3 @@ io_arrayMake(char * __restrict psArgs, int nargs, cons **app ? i++ : i, **app ? app++ : app); return i; } - -/* - * io_MakeAV() Parse and make attribute/value pair - * @csArgs = Input argument line - * @csDelim = Delimiter for separate - * @psAttr = Output Attribute - * @attrLen = Size of attribute array - * @psValue = Output Value, if ==NULL this element not present value or not wanted for return - * @valLen = Size of value array - * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items -*/ -int -io_MakeAV(const char * __restrict csArgs, const char *csDelim, - char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen) -{ - register int ret = 0; - char *pos, *psBuf; - - if (!csArgs || !csDelim || !psAttr || !attrLen) - return -1; - if (psValue && !valLen) - return -1; - else - memset(psValue, 0, valLen); - psBuf = strdup(csArgs); - if (!psBuf) { - LOGERR; - return -1; - } - - pos = strpbrk(psBuf, csDelim); - if (pos) - *pos++ = 0; - ret++; - strlcpy(psAttr, psBuf, attrLen); - - if (pos && *pos) { - ret++; - if (psValue) - strlcpy(psValue, pos, valLen); - } - - free(psBuf); - return ret; -} -