diff --git a/prick_darr.h b/prick_darr.h index c3cc7da..17304e6 100644 --- a/prick_darr.h +++ b/prick_darr.h @@ -45,6 +45,8 @@ void prick_darr_ensure_remaining(void **ptr, uint32_t space); #ifdef PRICK_DARR_IMPL +#include +#include #include #ifndef PRICK_DARR_MULT @@ -53,15 +55,25 @@ void prick_darr_ensure_remaining(void **ptr, uint32_t space); #define MAX(A, B) ((A) > (B) ? (A) : (B)) #define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define FAIL(...) \ + do \ + { \ + fprintf(stderr, "FAIL: prick_darr: "); \ + fprintf(stderr, __VA_ARGS__); \ + exit(1); \ + } while (0) void prick_darr_make(void **ptr, uint32_t size) { if (!ptr) return; prick_darr_t *darr = calloc(1, sizeof(*darr) + size); - darr->size = 0; - darr->capacity = size; - *ptr = (darr + 1); + if (!darr) + FAIL("Could not allocate memory (%lu bytes) for new dynamic array.\n", + sizeof(*darr) + size); + darr->size = 0; + darr->capacity = size; + *ptr = (darr + 1); } void prick_darr_free(void **data) @@ -80,8 +92,14 @@ void prick_darr_ensure_remaining(void **ptr, uint32_t space) if (darr->capacity - darr->size < space) { void *new_darr = NULL; - prick_darr_make(&new_darr, - MAX(darr->capacity * PRICK_DARR_MULT, darr->size + space)); + uint64_t new_capacity = + MAX(darr->capacity * PRICK_DARR_MULT, darr->size + space); + prick_darr_make(&new_darr, new_capacity); + + if (!new_darr) + FAIL("Could not allocate new dynamic array with %lu bytes capacity.\n", + new_capacity); + PRICK_DARR_SIZE(new_darr) = darr->size; memcpy(new_darr, *ptr, darr->size); prick_darr_free(ptr); @@ -91,6 +109,8 @@ void prick_darr_ensure_remaining(void **ptr, uint32_t space) void prick_darr_append_byte(void **ptr, uint8_t byte) { + if (!ptr || !*ptr) + return; prick_darr_ensure_remaining(ptr, 1); prick_darr_t *darr = PRICK_DARR_GET(*ptr); darr->bytes[darr->size++] = byte; @@ -98,9 +118,11 @@ void prick_darr_append_byte(void **ptr, uint8_t byte) void prick_darr_append(void **ptr, void *data, uint32_t size) { + if (!ptr || !*ptr || !data) + return; prick_darr_ensure_remaining(ptr, size); prick_darr_t *darr = PRICK_DARR_GET(*ptr); - memcpy(*ptr + darr->size, data, size); + memcpy(((uint8_t *)*ptr) + darr->size, data, size); darr->size += size; } @@ -113,6 +135,9 @@ void prick_darr_clone(void **dest, void **src) PRICK_DARR_SIZE(*dest) = PRICK_DARR_SIZE(*src); } +#undef MAX +#undef MIN + #endif #endif