shm_array.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "precompile.h"
  2. #include "memutil.h"
  3. #include "array.h"
  4. #include "shm_array.h"
  5. #include "shm_mem.h"
  6. #define DEFAULT_NUM 15
  7. TOOLKIT_API array_header_t *shm_array_make(int nelts, int elt_size)
  8. {
  9. array_header_t *arr = shm_malloc(sizeof(array_header_t));
  10. if (nelts <= 0)
  11. nelts = DEFAULT_NUM;
  12. arr->elts = shm_malloc(elt_size * nelts);
  13. arr->elt_size = elt_size;
  14. arr->nelts = 0;
  15. arr->nalloc = nelts;
  16. return arr;
  17. }
  18. TOOLKIT_API void shm_array_free(array_header_t *arr)
  19. {
  20. shm_free(arr->elts);
  21. shm_free(arr);
  22. }
  23. TOOLKIT_API void shm_array_free2(array_header_t *arr)
  24. {
  25. int i;
  26. for (i = 0; i < arr->nelts; ++i) {
  27. shm_free(ARRAY_IDX(arr, i, void*));
  28. }
  29. shm_free(arr->elts);
  30. shm_free(arr);
  31. }
  32. TOOLKIT_API void *shm_array_push(array_header_t *arr)
  33. {
  34. shm_array_check_expand(&arr->elts, arr->elt_size, arr->nelts, &arr->nalloc);
  35. return arr->elts + (arr->elt_size * (arr->nelts++));
  36. }
  37. TOOLKIT_API void shm_array_cat(array_header_t *dst, const array_header_t *src)
  38. {
  39. int elt_size = dst->elt_size;
  40. if (dst->nelts + src->nelts > dst->nalloc) {
  41. int new_size = (dst->nalloc <= 0) ? 1 : dst->nalloc * 2;
  42. char *new_data;
  43. while (dst->nelts + src->nelts > new_size) {
  44. new_size *= 2;
  45. }
  46. new_data = shm_malloc(elt_size * new_size);
  47. memcpy(new_data, dst->elts, dst->nalloc * elt_size);
  48. shm_free(dst->elts);
  49. dst->elts = new_data;
  50. dst->nalloc = new_size;
  51. }
  52. memcpy(dst->elts + dst->nelts * elt_size, src->elts,
  53. elt_size * src->nelts);
  54. dst->nelts += src->nelts;
  55. }
  56. TOOLKIT_API array_header_t * shm_array_copy(const array_header_t *arr)
  57. {
  58. array_header_t *res = shm_array_make(arr->nelts, arr->elt_size);
  59. memcpy(res->elts, arr->elts, arr->elt_size * arr->nelts);
  60. res->nelts = arr->nelts;
  61. memset(res->elts + res->elt_size * res->nelts, 0,
  62. res->elt_size * (res->nalloc - res->nelts));
  63. return res;
  64. }