array.h (4207B)
#pragma once
#include <stdlib.h>
#include <stdio.h>
#define ARRAY_PUSH(dest, len, cap, item) \
do { \
size_t arr_newcap, arr_itemsize; \
void* arr_newptr; \
if ((len) >= (cap)) { \
arr_newcap = (cap) == 0 ? 256 : (cap) * 2; \
arr_itemsize = sizeof(*(dest)); \
if (arr_newcap <= (cap) || arr_newcap > SIZE_MAX / arr_itemsize) { \
fprintf(stderr, "array: capacity overflow (cap=%zu)\n", (size_t)(cap)); \
exit(1); \
} \
\
arr_newptr = realloc((dest), arr_newcap * arr_itemsize); \
if (!arr_newptr) { \
fprintf(stderr, "array: could not reallocate\n"); \
exit(1); \
} \
(dest) = arr_newptr; \
(cap) = arr_newcap; \
} \
\
(dest)[(len)++] = (item); \
} while (0)
// similar but with the +1 size check and null delimiter at the end!
#define STRING_PUSH(dest, len, cap, item) \
do { \
size_t arr_newcap, arr_itemsize; \
void* arr_newptr; \
if ((len) + 1 >= (cap)) { /* +1 */ \
arr_newcap = (cap) == 0 ? 256 : (cap) * 2; \
arr_itemsize = sizeof(*(dest)); \
if (arr_newcap <= (cap) || arr_newcap > SIZE_MAX / arr_itemsize) { \
fprintf(stderr, "array: capacity overflow (cap=%zu)\n", (size_t)(cap)); \
exit(1); \
} \
\
arr_newptr = realloc((dest), arr_newcap * arr_itemsize); \
if (!arr_newptr) { \
fprintf(stderr, "array: could not reallocate\n"); \
exit(1); \
} \
(dest) = arr_newptr; \
(cap) = arr_newcap; \
} \
\
(dest)[(len)++] = (item); \
(dest)[(len)] = '\0'; \
} while (0)