--- libaitio/src/Attic/sarray.c 2011/05/03 08:39:14 1.1 +++ libaitio/src/Attic/sarray.c 2011/05/03 08:39:14 1.1.2.1 @@ -0,0 +1,94 @@ +#include "global.h" + + +/* + * io_sarrInit() - Create and initialize dynamic split-order array + * @numItems = Number of Items + * @segLen = Length of segment + * return: NULL error, != NULL allocated memory for array + */ +inline sarr_t * +io_sarrInit(int numItems, int segLen) +{ + sarr_t *arr = NULL; + + if (segLen < 1) + return NULL; + + arr = malloc(sizeof(sarr_t)); + if (!arr) { + LOGERR; + return NULL; + } + + arr->sarr_num = numItems; + arr->sarr_seg = segLen; + arr->sarr_siz = numItems / segLen; + arr->sarr_data = calloc(arr->sarr_siz, sizeof(sarr_seg_t)); + if (!arr->sarr_data) { + LOGERR; + free(arr); + return NULL; + } else + memset(arr->sarr_data, 0, arr->sarr_siz * sizeof(sarr_seg_t)); + + return arr; +} + +/* + * io_sarrDestroy() - Free all data in dynamic split-order array and Destroy array + * @parr = Array + * return: none + */ +inline void +io_sarrDestroy(sarr_t ** __restrict parr) +{ + register int i; + + assert(parr); + if (!parr) + return; + + for (i = 0; i < (*parr)->sarr_siz; i++) + if ((*parr)->sarr_data[i]) { + free((*parr)->sarr_data[i]); + (*parr)->sarr_data[i] = NULL; + } + + if ((*parr)->sarr_data) + free((*parr)->sarr_data); + free(*parr); + *parr = NULL; +} + +/* + * io_sarrVacuum() - Vacuum dynamic split-order array, empty segments will be freed + * @arr = Array + * return: -1 error, >-1 freed segments + */ +int +io_sarrVacuum(sarr_t * __restrict arr) +{ + register int i, j; + int cx = 0; + sarr_seg_t seg; + + assert(arr); + if (!arr) + return -1; + + for (i = 0; i < arr->sarr_siz; i++) + if (arr->sarr_data[i]) { + for (j = 0, seg = arr->sarr_data[i]; j < arr->sarr_seg; j++) + if (seg[j]) + break; + if (j == arr->sarr_seg) { + free(arr->sarr_data[i]); + arr->sarr_data[i] = NULL; + cx++; + } + } + + return cx; +} +