--- libaitio/src/Attic/sarray.c 2011/05/03 08:39:14 1.1.2.1 +++ libaitio/src/Attic/sarray.c 2011/05/03 14:22:18 1.1.2.2 @@ -23,7 +23,7 @@ io_sarrInit(int numItems, int segLen) arr->sarr_num = numItems; arr->sarr_seg = segLen; - arr->sarr_siz = numItems / segLen; + arr->sarr_siz = numItems / segLen + 1; arr->sarr_data = calloc(arr->sarr_siz, sizeof(sarr_seg_t)); if (!arr->sarr_data) { LOGERR; @@ -92,3 +92,93 @@ io_sarrVacuum(sarr_t * __restrict arr) return cx; } +/* + * io_sarrGrow() - Grow/Shrink dynamic split-order array, Use with care when it shrink!!! + * @arr = Array + * @newNumItems = Number of Items + * return: -1 error, 0 ok + */ +int +io_sarrGrow(sarr_t * __restrict arr, int newNumItems) +{ + sarr_seg_t *data; + int seg, n = 0; + register int i; + + assert(arr); + if (!arr) + return -1; + + arr->sarr_num = newNumItems; + seg = newNumItems / arr->sarr_seg + 1; + if (arr->sarr_siz == seg) + return n; + if (arr->sarr_siz < seg) + n = seg - arr->sarr_siz; + else + for (i = seg; i < arr->sarr_siz; i++) + if (arr->sarr_data[i]) + free(arr->sarr_data[i]); + + arr->sarr_siz = seg; + data = realloc(arr->sarr_data, arr->sarr_siz * sizeof(sarr_seg_t)); + if (!data) { + LOGERR; + return -1; + } else + arr->sarr_data = data; + memset(arr->sarr_data + (arr->sarr_siz - n), 0, n * sizeof(sarr_seg_t)); + + return 0; +} + +/* + * io_sarrGet() - Get element from dynamic split-order array + * @arr = Array + * @idx = Index (warning 1st element is at position 1) + * return: NULL not found, !=NULL element + */ +inline void * +io_sarrGet(sarr_t * __restrict arr, u_int idx) +{ + void *ret = NULL; + sarr_seg_t seg; + + assert(arr); + if (!arr || idx < 1 || arr->sarr_num < idx) + return ret; + + seg = arr->sarr_data[idx / arr->sarr_seg]; + if (seg) + ret = seg[idx % arr->sarr_seg]; + + return ret; +} + +/* + * io_sarrSet() - Set element to dynamic split-order array + * @arr = Array + * @idx = Index (warning 1st element is at position 1) + * @data = Value + * return: NULL error or empty, !=NULL old value in element + */ +inline void * +io_sarrSet(sarr_t * __restrict arr, u_int idx, void *data) +{ + void *ret = NULL; + sarr_seg_t seg; + register int pos; + + assert(arr); + if (!arr || idx < 1 || arr->sarr_num < idx) + return ret; + + seg = arr->sarr_data[idx / arr->sarr_seg]; + if (seg) { + pos = idx % arr->sarr_seg; + ret = seg[pos]; + seg[pos] = data; + } + + return ret; +}