--- libaitio/src/Attic/array.c 2012/03/27 21:37:56 1.7.4.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.7.4.1 2012/03/27 21:37:56 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 @@ -57,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); @@ -98,20 +99,22 @@ 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; } @@ -131,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; @@ -159,9 +162,11 @@ 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; } /* @@ -177,8 +182,8 @@ 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; } @@ -186,7 +191,7 @@ io_arrayDestroy(array_t ** __restrict parr) * 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) @@ -199,7 +204,7 @@ io_arrayLen(array_t * __restrict arr) for (i = io_arraySize(arr); i && !arr->arr_data[i - 1]; i--); - return i; + return --i; } /* @@ -227,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; @@ -239,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; @@ -298,6 +305,7 @@ io_arrayVacuum(array_t * __restrict arr, int fromWhere } } + arr->arr_last = io_arrayLen(arr); return cx; } @@ -317,7 +325,7 @@ io_arrayElem(array_t * __restrict arr, int n, void *da if (!arr) return (void*) -1; - if (n > io_arraySize(arr) && io_arrayGrow(arr, n + 1, 0)) + if (n >= io_arraySize(arr) && io_arrayGrow(arr, n + 1, 0)) return (void*) -1; dat = io_arrayGet(arr, n); @@ -332,17 +340,28 @@ io_arrayElem(array_t * __restrict arr, int n, void *da * * @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; 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) @@ -350,6 +369,8 @@ io_arrayPush(array_t * __restrict arr, void **data) ret = i; break; } +#endif + arr->arr_data[++arr->arr_last] = *data; return ret; } @@ -365,12 +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; if (!arr) return -1; +#if 0 for (i = io_arraySize(arr) - 1; i >= 0; i--) if (arr->arr_data[i]) { if (data) @@ -380,7 +404,14 @@ 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; } @@ -406,6 +437,7 @@ 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); } @@ -427,34 +459,14 @@ io_arrayCopy(array_t ** __restrict dest, array_t * __r *dest = io_arrayInit(io_arraySize(src)); if (!*dest) return -1; + else + (*dest)->arr_last = src->arr_last; memcpy((*dest)->arr_data, src->arr_data, io_arraySize(*dest) * sizeof(void*)); 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 - */ -inline int -io_argsNum(const char *csArgs, const char *csDelim) -{ - register int res; - char *pos; - - assert(csArgs); - assert(csDelim); - if (!csArgs || !csDelim) - return -1; - - for (res = 1, pos = (char*) csArgs; (pos = strpbrk(pos, csDelim)); res++, pos++); - return res; -} - -/* * io_arrayMake() Parse and make array from arguments ... (input string will be modified!!! * and output array must be free with io_arrayDestroy() after use!) * @@ -490,50 +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; -} -