|
version 1.2.4.2, 2011/05/19 03:01:20
|
version 1.7, 2012/02/02 21:32:42
|
|
Line 69 io_arrayInit(int numItems)
|
Line 69 io_arrayInit(int numItems)
|
| free(arr); |
free(arr); |
| return NULL; |
return NULL; |
| } else |
} else |
| memset(arr->arr_data, 0, io_arraySize(arr) * sizeof(void*)); | io_arrayZero(arr); |
| |
|
| return arr; |
return arr; |
| } |
} |
| |
|
| /* |
/* |
| * io_arrayFrom() - Create and fill array from array with pointers |
* io_arrayFrom() - Create and fill array from array with pointers |
| * @argv = Array with pointers | * @pargv = Array with pointers |
| * @argc = Number of Items, if 0 walk through argv and stop when reach NULL item |
* @argc = Number of Items, if 0 walk through argv and stop when reach NULL item |
| * return: NULL error, != NULL allocated memory for array | * return: NULL error, != NULL allocated new array |
| */ |
*/ |
| inline array_t * |
inline array_t * |
| io_arrayFrom(const char **argv, int argc) | io_arrayFrom(const char *** __restrict pargv, int argc) |
| { |
{ |
| array_t *arr = NULL; |
array_t *arr = NULL; |
| const char **a = NULL; |
const char **a = NULL; |
| register int num = 0; |
register int num = 0; |
| |
|
| assert(argv); | assert(pargv); |
| if (!argv || !*argv || argc < 0) | if (!pargv || !*pargv || argc < 0) |
| return NULL; |
return NULL; |
| |
|
| if (argc) |
if (argc) |
| num = argc; |
num = argc; |
| else |
else |
| for (a = argv; *a; a++, num++); | for (a = *pargv; *a; a++, num++); |
| |
|
| arr = malloc(sizeof(array_t)); |
arr = malloc(sizeof(array_t)); |
| if (!arr) { |
if (!arr) { |
|
Line 109 io_arrayFrom(const char **argv, int argc)
|
Line 109 io_arrayFrom(const char **argv, int argc)
|
| free(arr); |
free(arr); |
| return NULL; |
return NULL; |
| } else |
} else |
| memcpy(arr->arr_data, argv, io_arraySize(arr) * sizeof(void*)); | memcpy(arr->arr_data, *pargv, io_arraySize(arr) * sizeof(void*)); |
| |
|
| return arr; |
return arr; |
| } |
} |
|
Line 117 io_arrayFrom(const char **argv, int argc)
|
Line 117 io_arrayFrom(const char **argv, int argc)
|
| /* |
/* |
| * io_arrayTo() - Create and fill array with pointers from dynamic array |
* io_arrayTo() - Create and fill array with pointers from dynamic array |
| * @arr = Array |
* @arr = Array |
| * return: NULL error, != NULL allocated memory for array | * return: NULL error, != NULL allocated memory for array, NULL terminated |
| */ |
*/ |
| inline char ** |
inline char ** |
| io_arrayTo(array_t * __restrict arr) |
io_arrayTo(array_t * __restrict arr) |
|
Line 128 io_arrayTo(array_t * __restrict arr)
|
Line 128 io_arrayTo(array_t * __restrict arr)
|
| if (!arr || !io_arraySize(arr)) |
if (!arr || !io_arraySize(arr)) |
| return NULL; |
return NULL; |
| |
|
| args = (char **) calloc(io_arraySize(arr), sizeof(char*)); | args = (char **) calloc(io_arraySize(arr) + 1, sizeof(char*)); |
| if (!args) { |
if (!args) { |
| LOGERR; |
LOGERR; |
| return NULL; |
return NULL; |
| } else |
} else |
| memcpy(args, arr->arr_data, io_arraySize(arr) * sizeof(char*)); |
memcpy(args, arr->arr_data, io_arraySize(arr) * sizeof(char*)); |
| |
args[io_arraySize(arr)] = NULL; |
| |
|
| return args; |
return args; |
| } |
} |
|
Line 149 io_arrayFree(array_t * __restrict arr)
|
Line 150 io_arrayFree(array_t * __restrict arr)
|
| { |
{ |
| register int i; |
register int i; |
| |
|
| assert(arr); |
|
| if (!arr) |
if (!arr) |
| return; |
return; |
| |
|
|
Line 168 io_arrayFree(array_t * __restrict arr)
|
Line 168 io_arrayFree(array_t * __restrict arr)
|
| inline void |
inline void |
| io_arrayDestroy(array_t ** __restrict parr) |
io_arrayDestroy(array_t ** __restrict parr) |
| { |
{ |
| assert(parr); | if (!parr || !*parr) |
| if (!parr) | |
| return; |
return; |
| |
|
| if ((*parr)->arr_data) |
if ((*parr)->arr_data) |
|
Line 201 io_arrayLen(array_t * __restrict arr)
|
Line 200 io_arrayLen(array_t * __restrict arr)
|
| * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!! |
* io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!! |
| * @arr = Array |
* @arr = Array |
| * @newNumItems = Number of Items |
* @newNumItems = Number of Items |
| |
* @freeShrink = Free elements before shrink array |
| * return: -1 error, 0 ok |
* return: -1 error, 0 ok |
| */ |
*/ |
| int |
int |
| io_arrayGrow(array_t * __restrict arr, int newNumItems) | io_arrayGrow(array_t * __restrict arr, int newNumItems, int freeShrink) |
| { |
{ |
| void **data; |
void **data; |
| int n = 0; |
int n = 0; |
| /* register int i; */ | register int i; |
| |
|
| assert(arr); |
|
| if (!arr) |
if (!arr) |
| return -1; |
return -1; |
| |
|
|
Line 218 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
Line 217 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
| return 0; |
return 0; |
| if (io_arraySize(arr) < newNumItems) { |
if (io_arraySize(arr) < newNumItems) { |
| n = newNumItems - io_arraySize(arr); |
n = newNumItems - io_arraySize(arr); |
| } /* else | } else if (freeShrink) |
| for (i = newNumItems; i < arr->arr_num; i++) |
for (i = newNumItems; i < arr->arr_num; i++) |
| if (arr->arr_data[i]) |
if (arr->arr_data[i]) |
| free(arr->arr_data[i]); |
free(arr->arr_data[i]); |
| */ |
|
| |
|
| arr->arr_num = newNumItems; |
arr->arr_num = newNumItems; |
| data = realloc(arr->arr_data, io_arraySize(arr) * sizeof(void*)); | if (io_arraySize(arr)) { |
| if (!data) { | data = realloc(arr->arr_data, io_arraySize(arr) * sizeof(void*)); |
| LOGERR; | if (!data) { |
| return -1; | LOGERR; |
| } else | return -1; |
| arr->arr_data = data; | } else |
| memset(arr->arr_data + (io_arraySize(arr) - n), 0, n * sizeof(void*)); | arr->arr_data = data; |
| |
|
| |
memset(arr->arr_data + (io_arraySize(arr) - n), 0, n * sizeof(void*)); |
| |
} else { |
| |
if (arr->arr_data) |
| |
free(arr->arr_data); |
| |
arr->arr_data = NULL; |
| |
} |
| |
|
| return 0; |
return 0; |
| } |
} |
| |
|
|
Line 248 io_arrayVacuum(array_t * __restrict arr, int fromWhere
|
Line 253 io_arrayVacuum(array_t * __restrict arr, int fromWhere
|
| register int i, j, num; |
register int i, j, num; |
| int cx = 0; |
int cx = 0; |
| |
|
| assert(arr); |
|
| if (!arr) |
if (!arr) |
| return -1; |
return -1; |
| else |
else |
|
Line 263 io_arrayVacuum(array_t * __restrict arr, int fromWhere
|
Line 267 io_arrayVacuum(array_t * __restrict arr, int fromWhere
|
| */ |
*/ |
| if (fromWhere & VACUUM_LEFT) { |
if (fromWhere & VACUUM_LEFT) { |
| for (i = 0; i < num && !arr->arr_data[i]; i++); |
for (i = 0; i < num && !arr->arr_data[i]; i++); |
| |
if (i) { |
| |
memmove(arr->arr_data, arr->arr_data + i, (num - i) * sizeof(void*)); |
| |
memset(arr->arr_data + (num - i), 0, i * sizeof(void*)); |
| |
|
| memmove(arr->arr_data, arr->arr_data + i, (num - i) * sizeof(void*)); | num -= i; |
| memset(arr->arr_data + (num - i), 0, i * sizeof(void*)); | cx += i; |
| } |
| num -= i; | |
| cx += i; | |
| } |
} |
| if (fromWhere & VACUUM_BETWEEN) { |
if (fromWhere & VACUUM_BETWEEN) { |
| for (i = 0; i < num; i++) { |
for (i = 0; i < num; i++) { |
|
Line 289 io_arrayVacuum(array_t * __restrict arr, int fromWhere
|
Line 294 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 |
* io_arrayPush() - Push element into dynamic array like stack manner, place at first empty position |
| * @arr = Array |
* @arr = Array |
| * @data = Element, if set NULL return only first empty position |
* @data = Element, if set NULL return only first empty position |
|
Line 300 io_arrayPush(array_t * __restrict arr, void **data)
|
Line 330 io_arrayPush(array_t * __restrict arr, void **data)
|
| register int i; |
register int i; |
| int ret = -1; |
int ret = -1; |
| |
|
| assert(arr); | if (!arr) |
| | return -1; |
| |
|
| for (i = 0; i < io_arraySize(arr); i++) |
for (i = 0; i < io_arraySize(arr); i++) |
| if (!arr->arr_data[i]) { |
if (!arr->arr_data[i]) { |
|
Line 316 io_arrayPush(array_t * __restrict arr, void **data)
|
Line 347 io_arrayPush(array_t * __restrict arr, void **data)
|
| /* |
/* |
| * io_arrayPop() - Pop element from dynamic array like stack manner, last used position |
* io_arrayPop() - Pop element from dynamic array like stack manner, last used position |
| * @arr = Array |
* @arr = Array |
| * @data = Element, if set NULL return only first empty position | * @data = Element, if set NULL return only last used position |
| * @delAfter = Delete after Pop element, !=0 delete element from array after return data |
* @delAfter = Delete after Pop element, !=0 delete element from array after return data |
| * return: -1 not found used position, array is empty!, >-1 return element position |
* return: -1 not found used position, array is empty!, >-1 return element position |
| */ |
*/ |
|
Line 326 io_arrayPop(array_t * __restrict arr, void ** __restri
|
Line 357 io_arrayPop(array_t * __restrict arr, void ** __restri
|
| register int i; |
register int i; |
| int ret = -1; |
int ret = -1; |
| |
|
| assert(arr); | if (!arr) |
| | return -1; |
| |
|
| for (i = io_arraySize(arr) - 1; i >= 0; i--) |
for (i = io_arraySize(arr) - 1; i >= 0; i--) |
| if (arr->arr_data[i]) { |
if (arr->arr_data[i]) { |
|
Line 358 io_arrayConcat(array_t * __restrict dest, array_t * __
|
Line 390 io_arrayConcat(array_t * __restrict dest, array_t * __
|
| return -1; |
return -1; |
| |
|
| n = io_arraySize(dest); |
n = io_arraySize(dest); |
| if (io_arrayGrow(dest, n + io_arraySize(src))) | if (io_arrayGrow(dest, n + io_arraySize(src), 0)) |
| return -1; |
return -1; |
| memcpy(dest->arr_data + n, src->arr_data, io_arraySize(src) * sizeof(void*)); |
memcpy(dest->arr_data + n, src->arr_data, io_arraySize(src) * sizeof(void*)); |
| |
|
| return io_arraySize(dest); |
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); |
| } |
} |
| |
|
| /* |
/* |