From d95d7f2b51185da9d38c7a5bd8b51ecd0f3da246 Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Sun, 29 Mar 2026 17:53:10 -0600 Subject: [PATCH] feat(arena.c): Added arena init and added ArenaResult Want to handle errors with results, even if it meas boilerplate --- include/arena.h | 13 +++++++++++-- src/arena.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/include/arena.h b/include/arena.h index 3978c7c..f5618d8 100644 --- a/include/arena.h +++ b/include/arena.h @@ -17,6 +17,7 @@ typedef enum { ARENA_BAD_ALLOC, ARENA_OUT_OF_SPACE, ARENA_NULL_ARG, + ARENA_INVALID_SIZE, } ArenaErr; typedef struct { @@ -27,11 +28,19 @@ typedef struct { }; } ArenaPointer; -Arena arena_init(void *buffer, size_t size); +typedef struct { + bool is_valid; + union { + ArenaErr err; + Arena arena; + }; +} ArenaResult; + +ArenaResult arena_init(void *buffer, size_t size); void arena_destroy(Arena *arena); ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment); -ArenaPointer arena_push(Arena *arena, void *data); +ArenaErr arena_push(Arena *arena, void *data, size_t size); ArenaErr arena_realloc(Arena *arena, size_t new_size); size_t align_arena_offset(Arena *arena, size_t alignment); diff --git a/src/arena.c b/src/arena.c index 1538103..063e97d 100644 --- a/src/arena.c +++ b/src/arena.c @@ -1 +1,34 @@ #include "arena.h" +#include +#include + +ArenaResult arena_init(void *buffer, size_t size) { + if (buffer == NULL) { + ArenaResult err = { + .is_valid = false, + .err = ARENA_NULL_ARG, + }; + return err; + } + + if (size < 1) { + ArenaResult err = { + .is_valid = false, + .err = ARENA_INVALID_SIZE, + }; + return err; + } + + Arena new_arena = { + .data = buffer, + .size = size, + .offset = 0, + }; + + ArenaResult val = { + .is_valid = true, + .arena = new_arena, + }; + + return val; +}