#include "precompile.h" #include "memutil.h" #include "array.h" #include "shm_array.h" #include "shm_mem.h" #define DEFAULT_NUM 15 TOOLKIT_API array_header_t *shm_array_make(int nelts, int elt_size) { array_header_t *arr = shm_malloc(sizeof(array_header_t)); if (nelts <= 0) nelts = DEFAULT_NUM; arr->elts = shm_malloc(elt_size * nelts); arr->elt_size = elt_size; arr->nelts = 0; arr->nalloc = nelts; return arr; } TOOLKIT_API void shm_array_free(array_header_t *arr) { shm_free(arr->elts); shm_free(arr); } TOOLKIT_API void shm_array_free2(array_header_t *arr) { int i; for (i = 0; i < arr->nelts; ++i) { shm_free(ARRAY_IDX(arr, i, void*)); } shm_free(arr->elts); shm_free(arr); } TOOLKIT_API void *shm_array_push(array_header_t *arr) { shm_array_check_expand(&arr->elts, arr->elt_size, arr->nelts, &arr->nalloc); return arr->elts + (arr->elt_size * (arr->nelts++)); } TOOLKIT_API void shm_array_cat(array_header_t *dst, const array_header_t *src) { int elt_size = dst->elt_size; if (dst->nelts + src->nelts > dst->nalloc) { int new_size = (dst->nalloc <= 0) ? 1 : dst->nalloc * 2; char *new_data; while (dst->nelts + src->nelts > new_size) { new_size *= 2; } new_data = shm_malloc(elt_size * new_size); memcpy(new_data, dst->elts, dst->nalloc * elt_size); shm_free(dst->elts); dst->elts = new_data; dst->nalloc = new_size; } memcpy(dst->elts + dst->nelts * elt_size, src->elts, elt_size * src->nelts); dst->nelts += src->nelts; } TOOLKIT_API array_header_t * shm_array_copy(const array_header_t *arr) { array_header_t *res = shm_array_make(arr->nelts, arr->elt_size); memcpy(res->elts, arr->elts, arr->elt_size * arr->nelts); res->nelts = arr->nelts; memset(res->elts + res->elt_size * res->nelts, 0, res->elt_size * (res->nalloc - res->nelts)); return res; }