--- libaitio/src/Attic/array.c 2012/03/29 01:31:33 1.8 +++ libaitio/src/Attic/array.c 2012/05/14 12:49:21 1.9 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: array.c,v 1.8 2012/03/29 01:31:33 misho Exp $ +* $Id: array.c,v 1.9 2012/05/14 12:49:21 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -63,6 +63,7 @@ io_arrayInit(int numItems) return NULL; } + arr->arr_last = -1; arr->arr_num = numItems; arr->arr_data = calloc(io_arraySize(arr), sizeof(void*)); if (!arr->arr_data) { @@ -110,8 +111,10 @@ io_arrayFrom(const char *** __restrict pargv, int argc LOGERR; 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; } @@ -162,6 +165,8 @@ io_arrayFree(array_t * __restrict arr) free(arr->arr_data[i]); arr->arr_data[i] = NULL; } + + arr->arr_last = -1; } /* @@ -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; } /* @@ -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); 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,6 +459,8 @@ 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);