67 lines
1.3 KiB
C
67 lines
1.3 KiB
C
#include "arena.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// 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
|
|
}
|