From cde457593ea32971c1d43195f12fda6746a458c2 Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Sun, 29 Mar 2026 18:35:13 -0600 Subject: [PATCH] feat: Added arena_alloc Added arena_alloc and decided to change the arena pointer type from void * to uint8_t * because i need to support 1 byte pointer arithmetic, thought of using uintptr_t but not sure, the support seems really weird from what i read online so i'm sticking with good old uint8_t * (wich i know works). --- include/arena.h | 4 ++-- src/arena.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/include/arena.h b/include/arena.h index 397da80..12685f8 100644 --- a/include/arena.h +++ b/include/arena.h @@ -7,7 +7,7 @@ #include typedef struct { - void *data; + uint8_t *data; size_t size; size_t offset; } Arena; @@ -24,7 +24,7 @@ typedef struct { bool is_valid; union { ArenaErr err; - void *pointer; + uint8_t *pointer; }; } ArenaPointer; diff --git a/src/arena.c b/src/arena.c index ab7a690..89d7168 100644 --- a/src/arena.c +++ b/src/arena.c @@ -1,6 +1,7 @@ #include "arena.h" #include #include +#include ArenaResult arena_init(size_t size) { @@ -43,3 +44,30 @@ void arena_destroy(Arena *arena) { arena->size = 0; free(arena->data); } + +ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { + if (arena == NULL) { + ArenaPointer err = { + .is_valid = false, + .err = ARENA_NULL_ARG, + }; + return err; + } + + size_t new_offset = align_arena_offset(arena, alignment); + if (new_offset + size >= arena->size) { + ArenaPointer err = { + .is_valid = false, + .err = ARENA_OUT_OF_SPACE, + }; + return err; + } + + arena->offset = new_offset; + + ArenaPointer val = { + .is_valid = true, + .pointer = arena->data + arena->offset, + }; + return val; +}