--- libaitio/src/Attic/array.c 2011/08/26 12:51:01 1.3.2.2 +++ libaitio/src/Attic/array.c 2011/12/12 14:45:19 1.5.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: array.c,v 1.3.2.2 2011/08/26 12:51:01 misho Exp $ +* $Id: array.c,v 1.5.2.1 2011/12/12 14:45:19 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -69,7 +69,7 @@ io_arrayInit(int numItems) free(arr); return NULL; } else - memset(arr->arr_data, 0, io_arraySize(arr) * sizeof(void*)); + io_arrayZero(arr); return arr; } @@ -150,7 +150,6 @@ io_arrayFree(array_t * __restrict arr) { register int i; - assert(arr); if (!arr) return; @@ -169,7 +168,6 @@ io_arrayFree(array_t * __restrict arr) inline void io_arrayDestroy(array_t ** __restrict parr) { - assert(parr && *parr); if (!parr || !*parr) return; @@ -202,16 +200,16 @@ io_arrayLen(array_t * __restrict arr) * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!! * @arr = Array * @newNumItems = Number of Items + * @freeShrink = Free elements before shrink array * return: -1 error, 0 ok */ int -io_arrayGrow(array_t * __restrict arr, int newNumItems) +io_arrayGrow(array_t * __restrict arr, int newNumItems, int freeShrink) { void **data; int n = 0; -/* register int i; */ + register int i; - assert(arr); if (!arr) return -1; @@ -219,11 +217,10 @@ io_arrayGrow(array_t * __restrict arr, int newNumItems return 0; if (io_arraySize(arr) < newNumItems) { n = newNumItems - io_arraySize(arr); - } /* else + } else if (freeShrink) for (i = newNumItems; i < arr->arr_num; i++) if (arr->arr_data[i]) free(arr->arr_data[i]); - */ arr->arr_num = newNumItems; if (io_arraySize(arr)) { @@ -256,7 +253,6 @@ io_arrayVacuum(array_t * __restrict arr, int fromWhere register int i, j, num; int cx = 0; - assert(arr); if (!arr) return -1; else @@ -298,6 +294,31 @@ io_arrayVacuum(array_t * __restrict arr, int fromWhere } /* + * 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 @@ -309,7 +330,8 @@ io_arrayPush(array_t * __restrict arr, void **data) register int i; int ret = -1; - assert(arr); + if (!arr) + return -1; for (i = 0; i < io_arraySize(arr); i++) if (!arr->arr_data[i]) { @@ -335,7 +357,8 @@ io_arrayPop(array_t * __restrict arr, void ** __restri register int i; int ret = -1; - assert(arr); + if (!arr) + return -1; for (i = io_arraySize(arr) - 1; i >= 0; i--) if (arr->arr_data[i]) { @@ -367,11 +390,33 @@ io_arrayConcat(array_t * __restrict dest, array_t * __ return -1; n = io_arraySize(dest); - if (io_arrayGrow(dest, n + io_arraySize(src))) + if (io_arrayGrow(dest, n + io_arraySize(src), 0)) return -1; memcpy(dest->arr_data + n, src->arr_data, io_arraySize(src) * sizeof(void*)); return io_arraySize(dest); +} + +/* + * 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 + */ +int +io_arrayCopy(array_t ** __restrict dest, array_t * __restrict src) +{ + assert(dest); + assert(src); + if (!dest || !src) + return -1; + + *dest = io_arrayInit(io_arraySize(src)); + if (!*dest) + return -1; + + memcpy((*dest)->arr_data, src->arr_data, io_arraySize(*dest) * sizeof(void*)); + return io_arraySize(*dest); } /*