#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; }