diff options
| author | steven-na <noreply.github@stvnc.dev> | 2026-07-28 02:12:54 -0700 |
|---|---|---|
| committer | steven-na <noreply.github@stvnc.dev> | 2026-07-28 02:12:54 -0700 |
| commit | 8bec6205ae1631dc0896fe25795b2946ed414df0 (patch) | |
| tree | a40734bf042ab2236c65254bed08fac23bccc3e5 /src/ez_arena.c | |
| parent | acea02e9b90a83167d15e62741c8e8bb9f0d4b7c (diff) | |
Arenas and start work on strings
Diffstat (limited to 'src/ez_arena.c')
| -rw-r--r-- | src/ez_arena.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/ez_arena.c b/src/ez_arena.c new file mode 100644 index 0000000..e37766e --- /dev/null +++ b/src/ez_arena.c @@ -0,0 +1,58 @@ +#include "ez_arena.h" + +#include <stdlib.h> +#include <string.h> + +ez_arena_t *ez_arena_create(u64 size, b32 zero_out) { + ez_arena_t *alloc = malloc(size + sizeof(ez_arena_t)); + + if (!alloc) { + return NULL; + } + + if (zero_out) { + memset((u8*)alloc+EZ_ARENA_BASE_POS, 0, size); + } + + *alloc = (ez_arena_t){ .alloc_size = size, .pos = EZ_ARENA_BASE_POS }; + + return alloc; +} + +void *ez_arena_alloc(ez_arena_t *arena, u64 alloc_amount) { + u64 pos_aligned = ALIGN_UP_POW2(arena->pos, ARENA_ALIGN); + u64 new_pos = pos_aligned + alloc_amount; + + if (new_pos > arena->alloc_size + sizeof(ez_arena_t)) { return NULL; } + + arena->pos = new_pos; + + u8* out = (u8*)arena + pos_aligned; + + memset(out, 0, alloc_amount); + + return out; +} + +void *ez_arena_alloc_nz(ez_arena_t *arena, u64 alloc_amount) { + u64 pos_aligned = ALIGN_UP_POW2(arena->pos, ARENA_ALIGN); + u64 new_pos = pos_aligned + alloc_amount; + + if (new_pos > arena->alloc_size + sizeof(ez_arena_t)) { return NULL; } + + arena->pos = new_pos; + + return (u8*)arena + pos_aligned; +} + +void ez_arena_clear(ez_arena_t *arena, b32 zero_out) { + if (zero_out) { + memset((u8*)arena+EZ_ARENA_BASE_POS, 0, arena->alloc_size); + } + + arena->pos = EZ_ARENA_BASE_POS; +} + +void ez_arena_destroy(ez_arena_t *arena) { + free(arena); +} |