--- libelwix/src/array.c 2014/01/29 14:16:54 1.4 +++ libelwix/src/array.c 2019/01/23 17:40:37 1.8.4.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: array.c,v 1.4 2014/01/29 14:16:54 misho Exp $ +* $Id: array.c,v 1.8.4.2 2019/01/23 17:40:37 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2014 +Copyright 2004 - 2019 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -68,12 +68,41 @@ array_Init(int numItems) e_free(arr); return NULL; } else - array_Zero(arr); + memset(arr->arr_data, 0, array_Size(arr) * sizeof(intptr_t)); return arr; } /* + * array_Init2() - Initialize dynamic array + * + * @arr = Allocated array variable + * @numItems = Number of Items + * return: NULL error, != NULL allocated memory for array + */ +array_t * +array_Init2(array_t * __restrict arr, int numItems) +{ + if (!arr) + return array_Init(numItems); + + if (array_Size(arr)) + return NULL; /* already allocated array! */ + + arr->arr_last = -1; + arr->arr_num = numItems; + arr->arr_data = e_calloc(array_Size(arr), sizeof(intptr_t)); + if (!arr->arr_data) { + e_free(arr); + return NULL; + } else + memset(arr->arr_data, 0, array_Size(arr) * sizeof(intptr_t)); + + return arr; +} + + +/* * array_From() - Create and fill array from array with pointers * * @pargv = Array with pointers @@ -146,12 +175,10 @@ array_Free(array_t * __restrict arr) return; for (i = 0; i < array_Size(arr); i++) - if (arr->arr_data[i]) { + if (arr->arr_data[i]) e_free(arr->arr_data[i]); - arr->arr_data[i] = NULL; - } - arr->arr_last = -1; + array_Zero(arr); } /* @@ -170,6 +197,44 @@ array_Destroy(array_t ** __restrict parr) e_free((*parr)->arr_data); e_free(*parr); *parr = NULL; +} + +/* + * array_Destroy2() - Free data in dynamic array + * + * @parr = Array + * return: none + */ +void +array_Destroy2(array_t * __restrict arr) +{ + if (!arr) + return; + + if (arr->arr_data) + e_free(arr->arr_data); + memset(arr, 0, sizeof(array_t)); +} +/* + * array_Reset() - Reset array to initial state + * + * @parr = Array + * @purge = Purge all data, if <>0 then will be free entire data memory + * return: none + */ +void +array_Reset(array_t * __restrict arr, int purge) +{ + if (!arr) + return; + + if (purge && arr->arr_data) { + e_free(arr->arr_data); + arr->arr_num = 0; + arr->arr_data = e_calloc(array_Size(arr), sizeof(intptr_t)); + } + + array_Zero(arr); } /*