diff --git a/include/arena.h b/include/arena.h index 12685f8..18a9470 100644 --- a/include/arena.h +++ b/include/arena.h @@ -7,13 +7,13 @@ #include typedef struct { - uint8_t *data; + uint8_t *buffer; size_t size; size_t offset; } Arena; typedef enum { - ARENA_OK, + ARENA_OK = 0, ARENA_BAD_ALLOC, ARENA_OUT_OF_SPACE, ARENA_NULL_ARG, @@ -24,7 +24,7 @@ typedef struct { bool is_valid; union { ArenaErr err; - uint8_t *pointer; + uint8_t *address; }; } ArenaPointer; @@ -40,7 +40,7 @@ ArenaResult arena_init(size_t size); void arena_destroy(Arena *arena); ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment); -ArenaErr arena_push(Arena *arena, void *data, size_t size); +ArenaErr arena_push(Arena *arena, void *data, size_t size, size_t alignment); ArenaErr arena_realloc(Arena *arena, size_t new_size); size_t align_arena_offset(Arena *arena, size_t alignment); diff --git a/src/arena.c b/src/arena.c index 89d7168..f084b39 100644 --- a/src/arena.c +++ b/src/arena.c @@ -2,6 +2,7 @@ #include #include #include +#include ArenaResult arena_init(size_t size) { @@ -23,7 +24,7 @@ ArenaResult arena_init(size_t size) { } Arena new_arena = { - .data = buffer, + .buffer = buffer, .size = size, .offset = 0, }; @@ -42,7 +43,7 @@ void arena_destroy(Arena *arena) { arena->offset = 0; arena->size = 0; - free(arena->data); + free(arena->buffer); } ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { @@ -67,7 +68,46 @@ ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { ArenaPointer val = { .is_valid = true, - .pointer = arena->data + arena->offset, + .address = arena->buffer + arena->offset, }; return val; } + +ArenaErr arena_push(Arena *arena, void *data, size_t size, size_t alignment) { + if (arena == NULL || data == NULL) { + return ARENA_NULL_ARG; + } + + ArenaPointer pointer = arena_alloc(arena, size, alignment); + + if (!pointer.is_valid) { + size_t new_size = arena->size * 2; + ArenaErr err = arena_realloc(arena, new_size); + if (err != ARENA_OK) { + return err; + } + } + + + memcpy( + pointer.address, + data, + size); + + return ARENA_OK; +} + +ArenaErr arena_realloc(Arena *arena, size_t new_size) { + if (arena == NULL) { + return ARENA_NULL_ARG; + } + + uint8_t *tmp = realloc(arena->buffer, new_size); + if (tmp == NULL) { + return ARENA_BAD_ALLOC; + } + + arena->buffer = tmp; + arena->size = new_size; + return ARENA_OK; +}