From b1b2586afa06105291355a19f581016c347463bc Mon Sep 17 00:00:00 2001 From: physick Date: Tue, 11 Aug 2026 21:08:37 +0500 Subject: arena + dir reading --- src/utils/arena.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/utils/arena.c (limited to 'src/utils/arena.c') diff --git a/src/utils/arena.c b/src/utils/arena.c new file mode 100644 index 0000000..ce50d24 --- /dev/null +++ b/src/utils/arena.c @@ -0,0 +1,38 @@ +#include "arena.h" +#include +#include +#include +#include + +bool ArenaInit(Arena *arena, size_t capacity) { + arena->mem = malloc(capacity); + if (!arena->mem) { + return false; + } + arena->head = 0; + arena->capacity = capacity; + return true; +} + +void *ArenaAlloc(Arena *arena, size_t size) { + uintptr_t current_ptr = (uintptr_t)arena->mem + arena->head; + // Alignment + uintptr_t aligned_ptr = (current_ptr + 7) & ~7; + + size_t alignment_padding = aligned_ptr - current_ptr; + size_t total_needed = size + alignment_padding; + if (arena->head + total_needed > arena->capacity) { + return NULL; + } + + arena->head += total_needed; + return (void *)aligned_ptr; +} + +char *ArenaStrdup(Arena *arena, const char *str) { + size_t len = strlen(str) + 1; // adding a \0 + char *ptr = ArenaAlloc(arena, len); + if (ptr == NULL) return NULL; + memcpy(ptr, str, len); + return ptr; +} -- cgit v1.3