diff options
Diffstat (limited to 'dynarr.h')
-rw-r--r-- | dynarr.h | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/dynarr.h b/dynarr.h index 986c6ab..bbdd45f 100644 --- a/dynarr.h +++ b/dynarr.h @@ -4,9 +4,6 @@ #include <stdlib.h> #include <stdint.h> #include <string.h> -#include <err.h> - -#include "stdwrm.h" typedef struct { size_t count, capacity; } DynArrHeader; @@ -14,40 +11,43 @@ typedef struct { size_t count, capacity; } DynArrHeader; #define DA_HEADER(da) ((DynArrHeader*)(da) - 1) #define DA_INIT_CAP 16 -#define DA_INIT(da) {\ - char *da_init_ptr = ((char*)malloc(sizeof(DynArrHeader) + DA_INIT_CAP * sizeof(*da)));\ - if (!da_init_ptr) err(1, "dynamic array allocation failed");\ +#define DA_INIT_SZ(da, cap) do {\ + char *da_init_ptr = ((char*)malloc(sizeof(DynArrHeader) + cap * sizeof(*da)));\ + if (!da_init_ptr) { fprintf(stderr, "dynamic array allocation failed\n"); abort(); }\ da = (void *)(da_init_ptr + sizeof(DynArrHeader));\ - *DA_HEADER(da) = (DynArrHeader) { 0, DA_INIT_CAP };\ -} + *DA_HEADER(da) = (DynArrHeader) { 0, cap };\ +} while(0) + +#define DA_INIT(da) DA_INIT_SZ(da, DA_INIT_CAP) #define DA_FREE(da)\ free(DA_HEADER(da)) #define DA_LEN(da) (DA_HEADER(da)->count) -#define DA_FIT(da, count)\ +#define DA_FIT(da, count) do {\ if (count >= DA_HEADER(da)->capacity) {\ while (count >= DA_HEADER(da)->capacity) DA_HEADER(da)->capacity <<= 1;\ char *da_fit_ptr = realloc(DA_HEADER(da), sizeof(DynArrHeader) + DA_HEADER(da)->capacity * sizeof(*da));\ - if (!da_fit_ptr) err(1, "dynamic array reallocation failed");\ + if (!da_fit_ptr) { fprintf(stderr, "dynamic array reallocation failed\n"); abort(); }\ (da) = (void *)(da_fit_ptr + sizeof(DynArrHeader));\ - } + }\ +} while(0) -#define DA_PUSH(da, ...) {\ +#define DA_PUSH(da, ...) do {\ DA_FIT(da, DA_LEN(da) + 1);\ (da)[DA_HEADER(da)->count++] = (__VA_ARGS__);\ -} +} while(0) -#define DA_PUSH_MULT(da, buf, n) {\ +#define DA_PUSH_MULT(da, buf, n) do {\ DA_FIT(da, DA_LEN(da) + n);\ memcpy(&(da)[DA_HEADER(da)->count], buf, n * sizeof(*(da)));\ DA_HEADER(da)->count += n;\ -} +} while(0) #define DA_FOR(da, name)\ for (typeof(da) name = (da); name < &(da)[DA_LEN(da)]; name++) #define DA_FORVAL(da, name)\ - for (volatile typeof(*(da)) *da_iter = (da), name; da_iter < &(da)[DA_LEN(da)] && (name = *da_iter, 1); da_iter++) + for (volatile typeof(*(da)) *stdwrm__da_iter = (da), name; stdwrm__da_iter < &(da)[DA_LEN(da)] && (name = *stdwrm__da_iter, 1); stdwrm__da_iter++) #endif |