|
version 1.6, 2011/12/13 02:23:08
|
version 1.10.6.4, 2012/07/30 11:20:07
|
|
Line 12 terms:
|
Line 12 terms:
|
| All of the documentation and software included in the ELWIX and AITNET |
All of the documentation and software included in the ELWIX and AITNET |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
| |
|
| Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 | Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
| by Michael Pounov <misho@elwix.org>. All rights reserved. |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
| |
|
| Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
|
Line 48 SUCH DAMAGE.
|
Line 48 SUCH DAMAGE.
|
| |
|
| /* |
/* |
| * io_arrayInit() - Create and initialize dynamic array |
* io_arrayInit() - Create and initialize dynamic array |
| |
* |
| * @numItems = Number of Items |
* @numItems = Number of Items |
| * return: NULL error, != NULL allocated memory for array |
* return: NULL error, != NULL allocated memory for array |
| */ |
*/ |
|
Line 56 io_arrayInit(int numItems)
|
Line 57 io_arrayInit(int numItems)
|
| { |
{ |
| array_t *arr = NULL; |
array_t *arr = NULL; |
| |
|
| arr = malloc(sizeof(array_t)); | arr = io_malloc(sizeof(array_t)); |
| if (!arr) { |
if (!arr) { |
| LOGERR; |
LOGERR; |
| return NULL; |
return NULL; |
| } |
} |
| |
|
| |
arr->arr_last = -1; |
| arr->arr_num = numItems; |
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) { |
if (!arr->arr_data) { |
| LOGERR; |
LOGERR; |
| free(arr); | io_free(arr); |
| return NULL; |
return NULL; |
| } else |
} else |
| io_arrayZero(arr); |
io_arrayZero(arr); |
|
Line 76 io_arrayInit(int numItems)
|
Line 78 io_arrayInit(int numItems)
|
| |
|
| /* |
/* |
| * io_arrayFrom() - Create and fill array from array with pointers |
* io_arrayFrom() - Create and fill array from array with pointers |
| |
* |
| * @pargv = 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 new array |
* return: NULL error, != NULL allocated new array |
|
Line 96 io_arrayFrom(const char *** __restrict pargv, int argc
|
Line 99 io_arrayFrom(const char *** __restrict pargv, int argc
|
| else |
else |
| for (a = *pargv; *a; a++, num++); |
for (a = *pargv; *a; a++, num++); |
| |
|
| arr = malloc(sizeof(array_t)); | arr = io_malloc(sizeof(array_t)); |
| if (!arr) { |
if (!arr) { |
| LOGERR; |
LOGERR; |
| return NULL; |
return NULL; |
| } |
} |
| |
|
| arr->arr_num = num; |
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) { |
if (!arr->arr_data) { |
| LOGERR; |
LOGERR; |
| free(arr); | io_free(arr); |
| return NULL; |
return NULL; |
| } else | } else { |
| memcpy(arr->arr_data, *pargv, io_arraySize(arr) * sizeof(void*)); |
memcpy(arr->arr_data, *pargv, io_arraySize(arr) * sizeof(void*)); |
| |
arr->arr_last = io_arraySize(arr) - 1; |
| |
} |
| |
|
| return arr; |
return arr; |
| } |
} |
| |
|
| /* |
/* |
| * 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, NULL terminated |
* return: NULL error, != NULL allocated memory for array, NULL terminated |
| */ |
*/ |
|
Line 128 io_arrayTo(array_t * __restrict arr)
|
Line 134 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) + 1, sizeof(char*)); | args = (char **) io_calloc(io_arraySize(arr) + 1, sizeof(char*)); |
| if (!args) { |
if (!args) { |
| LOGERR; |
LOGERR; |
| return NULL; |
return NULL; |
|
Line 142 io_arrayTo(array_t * __restrict arr)
|
Line 148 io_arrayTo(array_t * __restrict arr)
|
| /* |
/* |
| * io_arrayFree() - Free all data in dynamic array items |
* io_arrayFree() - Free all data in dynamic array items |
| * (WARNING! If assign static array dont use this!!!) |
* (WARNING! If assign static array dont use this!!!) |
| |
* |
| * @arr = Array |
* @arr = Array |
| * return: none |
* return: none |
| */ |
*/ |
|
Line 155 io_arrayFree(array_t * __restrict arr)
|
Line 162 io_arrayFree(array_t * __restrict arr)
|
| |
|
| 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]) { |
| free(arr->arr_data[i]); | io_free(arr->arr_data[i]); |
| arr->arr_data[i] = NULL; |
arr->arr_data[i] = NULL; |
| } |
} |
| |
|
| |
arr->arr_last = -1; |
| } |
} |
| |
|
| /* |
/* |
| * io_arrayDestroy() - Free and destroy dynamic array |
* io_arrayDestroy() - Free and destroy dynamic array |
| |
* |
| * @parr = Array |
* @parr = Array |
| * return: none |
* return: none |
| */ |
*/ |
|
Line 172 io_arrayDestroy(array_t ** __restrict parr)
|
Line 182 io_arrayDestroy(array_t ** __restrict parr)
|
| return; |
return; |
| |
|
| if ((*parr)->arr_data) |
if ((*parr)->arr_data) |
| free((*parr)->arr_data); | io_free((*parr)->arr_data); |
| free(*parr); | io_free(*parr); |
| *parr = NULL; |
*parr = NULL; |
| } |
} |
| |
|
| /* |
/* |
| * io_arrayLen() - Get last used element in dynamic array (array Length) |
* io_arrayLen() - Get last used element in dynamic array (array Length) |
| |
* |
| * @arr = Array |
* @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 |
inline int |
| io_arrayLen(array_t * __restrict arr) |
io_arrayLen(array_t * __restrict arr) |
|
Line 193 io_arrayLen(array_t * __restrict arr)
|
Line 204 io_arrayLen(array_t * __restrict arr)
|
| |
|
| for (i = io_arraySize(arr); i && !arr->arr_data[i - 1]; i--); |
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!!! |
* 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 |
* @freeShrink = Free elements before shrink array |
|
Line 220 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
Line 232 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
| } else if (freeShrink) |
} 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]); | io_free(arr->arr_data[i]); |
| |
|
| arr->arr_num = newNumItems; |
arr->arr_num = newNumItems; |
| if (io_arraySize(arr)) { |
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) { |
if (!data) { |
| LOGERR; |
LOGERR; |
| return -1; |
return -1; |
|
Line 232 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
Line 244 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
| arr->arr_data = data; |
arr->arr_data = data; |
| |
|
| memset(arr->arr_data + (io_arraySize(arr) - n), 0, n * sizeof(void*)); |
memset(arr->arr_data + (io_arraySize(arr) - n), 0, n * sizeof(void*)); |
| |
arr->arr_last = io_arrayLen(arr); |
| } else { |
} else { |
| if (arr->arr_data) |
if (arr->arr_data) |
| free(arr->arr_data); | io_free(arr->arr_data); |
| arr->arr_data = NULL; |
arr->arr_data = NULL; |
| |
arr->arr_last = -1; |
| } |
} |
| |
|
| return 0; |
return 0; |
|
Line 243 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
Line 257 io_arrayGrow(array_t * __restrict arr, int newNumItems
|
| |
|
| /* |
/* |
| * io_arrayVacuum() - Vacuum dynamic array, empty elements will be deleted |
* io_arrayVacuum() - Vacuum dynamic array, empty elements will be deleted |
| |
* |
| * @arr = Array |
* @arr = Array |
| * @fromWhere = 1 begin, 2 ALL empty elements |
* @fromWhere = 1 begin, 2 ALL empty elements |
| * return: -1 error, 0 ok |
* return: -1 error, 0 ok |
|
Line 290 io_arrayVacuum(array_t * __restrict arr, int fromWhere
|
Line 305 io_arrayVacuum(array_t * __restrict arr, int fromWhere
|
| } |
} |
| } |
} |
| |
|
| |
arr->arr_last = io_arrayLen(arr); |
| return cx; |
return cx; |
| } |
} |
| |
|
| /* |
/* |
| * io_arrayElem() - Always GET/PUT element into dynamic array, if not enough elements grow array |
* io_arrayElem() - Always GET/PUT element into dynamic array, if not enough elements grow array |
| |
* |
| * @arr = Array |
* @arr = Array |
| * @n = Position |
* @n = Position |
| * @data = Element, if set NULL GET element at position or !=NULL PUT element at 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 |
* return: -1 error or !=-1 return element at position |
| */ |
*/ |
| inline void * |
inline void * |
| io_arrayElem(array_t * __restrict arr, int n, void **data) | io_arrayElem(array_t * __restrict arr, int n, void *data) |
| { |
{ |
| void *dat = NULL; |
void *dat = NULL; |
| |
|
| if (!arr) |
if (!arr) |
| return (void*) -1; |
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; |
return (void*) -1; |
| |
|
| dat = io_arrayGet(arr, n); |
dat = io_arrayGet(arr, n); |
| if (data) |
if (data) |
| io_arraySet(arr, n, *data); | io_arraySet(arr, n, data); |
| |
|
| return dat; |
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 |
| |
* @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 |
* return: -1 not found empty position, array is full!, >-1 return position of stored element into array |
| */ |
*/ |
| inline int |
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; |
register int i; |
| |
#endif |
| int ret = -1; |
int ret = -1; |
| |
|
| if (!arr) |
if (!arr) |
| return -1; |
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++) |
for (i = 0; i < io_arraySize(arr); i++) |
| if (!arr->arr_data[i]) { |
if (!arr->arr_data[i]) { |
| if (data) |
if (data) |
|
Line 340 io_arrayPush(array_t * __restrict arr, void **data)
|
Line 369 io_arrayPush(array_t * __restrict arr, void **data)
|
| ret = i; |
ret = i; |
| break; |
break; |
| } |
} |
| |
#endif |
| |
arr->arr_data[++arr->arr_last] = *data; |
| |
|
| return ret; |
return ret; |
| } |
} |
| |
|
| /* |
/* |
| * 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 last used 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 |
|
Line 354 io_arrayPush(array_t * __restrict arr, void **data)
|
Line 386 io_arrayPush(array_t * __restrict arr, void **data)
|
| inline int |
inline int |
| io_arrayPop(array_t * __restrict arr, void ** __restrict data, int delAfter) |
io_arrayPop(array_t * __restrict arr, void ** __restrict data, int delAfter) |
| { |
{ |
| |
#if 0 |
| register int i; |
register int i; |
| |
#endif |
| int ret = -1; |
int ret = -1; |
| |
|
| if (!arr) |
if (!arr) |
| return -1; |
return -1; |
| |
|
| |
#if 0 |
| 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]) { |
| if (data) |
if (data) |
|
Line 369 io_arrayPop(array_t * __restrict arr, void ** __restri
|
Line 404 io_arrayPop(array_t * __restrict arr, void ** __restri
|
| ret = i; |
ret = i; |
| break; |
break; |
| } |
} |
| |
#endif |
| |
ret = io_arrayLast(arr); |
| |
|
| |
if (data) |
| |
*data = arr->arr_data[ret]; |
| |
if (delAfter) |
| |
arr->arr_data[arr->arr_last--] = NULL; |
| |
|
| return ret; |
return ret; |
| } |
} |
| |
|
| /* |
/* |
| * io_arrayConcat() Concat source array to destination array |
* io_arrayConcat() Concat source array to destination array |
| |
* |
| * @dest = Destination array |
* @dest = Destination array |
| * @src = Source array |
* @src = Source array |
| * return: -1 error; >0 new count of destination array |
* return: -1 error; >0 new count of destination array |
|
Line 394 io_arrayConcat(array_t * __restrict dest, array_t * __
|
Line 437 io_arrayConcat(array_t * __restrict dest, array_t * __
|
| 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*)); |
| |
|
| |
dest->arr_last = io_arrayLen(dest); |
| return io_arraySize(dest); |
return io_arraySize(dest); |
| } |
} |
| |
|
| /* |
/* |
| * io_arrayCopy() Copy source array to destination array |
* io_arrayCopy() Copy source array to destination array |
| |
* |
| * @dest = Destination array, after use free with io_arrayDestroy() |
* @dest = Destination array, after use free with io_arrayDestroy() |
| * @src = Source array |
* @src = Source array |
| * return: -1 error; >0 count of destination array |
* return: -1 error; >0 count of destination array |
|
Line 414 io_arrayCopy(array_t ** __restrict dest, array_t * __r
|
Line 459 io_arrayCopy(array_t ** __restrict dest, array_t * __r
|
| *dest = io_arrayInit(io_arraySize(src)); |
*dest = io_arrayInit(io_arraySize(src)); |
| if (!*dest) |
if (!*dest) |
| return -1; |
return -1; |
| |
else |
| |
(*dest)->arr_last = src->arr_last; |
| |
|
| memcpy((*dest)->arr_data, src->arr_data, io_arraySize(*dest) * sizeof(void*)); |
memcpy((*dest)->arr_data, src->arr_data, io_arraySize(*dest) * sizeof(void*)); |
| return io_arraySize(*dest); |
return io_arraySize(*dest); |
|
Line 421 io_arrayCopy(array_t ** __restrict dest, array_t * __r
|
Line 468 io_arrayCopy(array_t ** __restrict dest, array_t * __r
|
| |
|
| /* |
/* |
| * io_argsNum() Parse and calculate number of arguments |
* io_argsNum() Parse and calculate number of arguments |
| |
* |
| * @csArgs = Input arguments line |
* @csArgs = Input arguments line |
| * @csDelim = Delimiter(s) for separate |
* @csDelim = Delimiter(s) for separate |
| * return: 0 error format; -1 error:: can`t read; >0 ok, number of items |
* return: 0 error format; -1 error:: can`t read; >0 ok, number of items |
|
Line 443 io_argsNum(const char *csArgs, const char *csDelim)
|
Line 491 io_argsNum(const char *csArgs, const char *csDelim)
|
| /* |
/* |
| * io_arrayMake() Parse and make array from arguments ... (input string will be modified!!! |
* io_arrayMake() Parse and make array from arguments ... (input string will be modified!!! |
| * and output array must be free with io_arrayDestroy() after use!) |
* and output array must be free with io_arrayDestroy() after use!) |
| |
* |
| * @psArgs = Input arguments line, after execute string is modified!!! |
* @psArgs = Input arguments line, after execute string is modified!!! |
| * @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs |
* @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs |
| * @csDelim = Delimiter(s) for separate |
* @csDelim = Delimiter(s) for separate |
|
Line 478 io_arrayMake(char * __restrict psArgs, int nargs, cons
|
Line 527 io_arrayMake(char * __restrict psArgs, int nargs, cons
|
| |
|
| /* |
/* |
| * io_MakeAV() Parse and make attribute/value pair |
* io_MakeAV() Parse and make attribute/value pair |
| |
* |
| * @csArgs = Input argument line |
* @csArgs = Input argument line |
| * @csDelim = Delimiter for separate |
* @csDelim = Delimiter for separate |
| * @psAttr = Output Attribute |
* @psAttr = Output Attribute |
|
Line 499 io_MakeAV(const char * __restrict csArgs, const char *
|
Line 549 io_MakeAV(const char * __restrict csArgs, const char *
|
| return -1; |
return -1; |
| else |
else |
| memset(psValue, 0, valLen); |
memset(psValue, 0, valLen); |
| psBuf = strdup(csArgs); | psBuf = io_strdup(csArgs); |
| if (!psBuf) { |
if (!psBuf) { |
| LOGERR; |
LOGERR; |
| return -1; |
return -1; |
|
Line 517 io_MakeAV(const char * __restrict csArgs, const char *
|
Line 567 io_MakeAV(const char * __restrict csArgs, const char *
|
| strlcpy(psValue, pos, valLen); |
strlcpy(psValue, pos, valLen); |
| } |
} |
| |
|
| free(psBuf); | io_free(psBuf); |
| return ret; |
return ret; |
| } |
} |
| |
|
| |
/* |
| |
* io_MakeAV2() Parse and make attribute/value pair over input string |
| |
* |
| |
* @csArgs = Input argument line, will be modified! |
| |
* @csDelim = Delimiter for separate |
| |
* @psAttr = Output Attribute |
| |
* @psValue = Output Value, if ==NULL this element not present value or not wanted for return |
| |
* return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items |
| |
*/ |
| |
int |
| |
io_MakeAV2(char * __restrict psArgs, const char *csDelim, |
| |
char ** __restrict psAttr, char ** __restrict psValue) |
| |
{ |
| |
register int ret = 0; |
| |
char *pos; |
| |
|
| |
if (!psArgs || !csDelim) |
| |
return -1; |
| |
|
| |
pos = strpbrk(psArgs, csDelim); |
| |
if (pos) { |
| |
*pos++ = 0; |
| |
ret++; |
| |
if (psAttr) |
| |
*psAttr = psArgs; |
| |
} else |
| |
return 0; |
| |
|
| |
if (psValue) { |
| |
if (pos && *pos) { |
| |
ret++; |
| |
*psValue = pos; |
| |
} else |
| |
*psValue = NULL; |
| |
} |
| |
|
| |
return ret; |
| |
} |