feat/adds-null-checks #4

Merged
HideyoshiNakazone merged 2 commits from feat/adds-null-checks into main 2026-04-16 00:07:00 +00:00
Showing only changes of commit 09e1a360fd - Show all commits

View File

@@ -25,43 +25,61 @@ typedef struct {
#define array_create(arr) \ #define array_create(arr) \
do { \ do { \
ArrayHeader *header = malloc(sizeof(*arr) * DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE + sizeof(ArrayHeader)); \ ArrayHeader *header = malloc( \
sizeof(*(arr)) * DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE + sizeof(ArrayHeader) \
); \
if (header == NULL) { \
abort(); \
} \
header->size = 0; \ header->size = 0; \
header->capacity = DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE; \ header->capacity = DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE; \
\ \
arr = (void *)(header + 1); \ (arr) = (void *)(header + 1); \
} while(0) } while(0)
#define array_get_header(arr) ((ArrayHeader*)(arr) - 1) #define array_get_header(arr) \
((arr) ? ((ArrayHeader*)(arr) - 1) : NULL)
#define array_destroy(arr) \ #define array_destroy(arr) \
do { \ do { \
if ((arr) == NULL) { \
break; \
} \
free(array_get_header(arr)); \ free(array_get_header(arr)); \
arr = NULL; \ (arr) = NULL; \
} while (0) } while (0)
#define array_push_value(arr, value) \ #define array_push_value(arr, value) \
do { \ do { \
if ((arr) == NULL) { \
array_create(arr); \
} \
ArrayHeader *header = array_get_header(arr); \ ArrayHeader *header = array_get_header(arr); \
if (header->size + 1 > header->capacity) { \ if (header->size >= header->capacity) { \
size_t new_capacity = header->capacity * DYNAMIC_ARRAY_CAPACITY_FACTOR; \ size_t new_capacity = header->capacity * DYNAMIC_ARRAY_CAPACITY_FACTOR; \
ArrayHeader *new_header = realloc(header, sizeof(*arr) * new_capacity + sizeof(ArrayHeader)); \ ArrayHeader *new_header = realloc( \
if (new_header != NULL) { \ header, sizeof(*(arr)) * new_capacity + sizeof(ArrayHeader) \
); \
if (new_header == NULL) { \
abort(); \
} \
header = new_header; \ header = new_header; \
} \
header->capacity = new_capacity; \ header->capacity = new_capacity; \
arr = (void *)(header + 1); \ (arr) = (void *)(header + 1); \
} \ } \
arr[header->size] = value; \ (arr)[header->size] = (value); \
header->size++; \ header->size++; \
} while (0) } while (0)
#define array_pop(arr) \ #define array_pop(arr) \
do { \ do { \
if ((arr) == NULL) { \
break; \
} \
ArrayHeader *header = array_get_header(arr); \ ArrayHeader *header = array_get_header(arr); \
if (header->size == 0) { \ if (header->size == 0) { \
break; \ break; \
@@ -70,4 +88,10 @@ typedef struct {
} while (0) } while (0)
#define array_size(arr) \
((arr) ? array_get_header(arr)->size : 0)
#define array_capacity(arr) \
((arr) ? array_get_header(arr)->capacity : 0)
#endif #endif