12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #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;
- }
|