#include "arena.h" #include #include // arena_new creates a new arena with the specified size. arena_t* arena_new(size_t size) { arena_t *a = malloc(sizeof(arena_t)); if (!a) return NULL; a->buf = malloc(size); if (!a->buf) { free(a); return NULL; } a->size = size; a->used = 0; a->next = NULL; return a; } // arena_free destroys the arena and its buffer. void arena_free(arena_t *a) { if (!a) return; // Free chained arenas if any arena_t *next; while (a) { next = a->next; free(a->buf); free(a); a = next; } } // arena_alloc allocates memory from the arena. void* arena_alloc(arena_t *a, size_t size) { // Align to 8 bytes for proper alignment size = (size + 7) & ~7; if (a->used + size > a->size) { // Could implement arena chaining here // For now, just fail return NULL; } void *ptr = a->buf + a->used; a->used += size; return ptr; } // arena_strdup duplicates a string into the arena. char* arena_strdup(arena_t *a, const char *s, size_t len) { char *copy = arena_alloc(a, len + 1); if (!copy) return NULL; memcpy(copy, s, len); copy[len] = '\0'; return copy; } // arena_reset resets the arena for reuse. void arena_reset(arena_t *a) { a->used = 0; // Could reset chained arenas here if implemented }