#include #include #include #include #include vx_arena_s * vx_new_arena(uint32_t capacity) { vx_arena_s *arena = malloc(vx_ceil_to(sizeof(vx_arena_s), 32) + capacity); arena->usage = 0; arena->capacity = capacity; arena->allocation = (void *) ((int8_t *) arena) + 32; arena->continuation = NULL; return arena; } void vx_free_arena(vx_arena_s *arena) { if(arena->continuation) { vx_free_arena(arena->continuation); } free(arena); } void * vx_arena_alloc(vx_arena_s *arena, uint32_t length) { if((arena->usage + length) >= arena->capacity) { if( ! arena->continuation) { arena->continuation = vx_new_arena(vx_max_u64(arena->capacity * 2, length * 2)); } return vx_arena_alloc(arena->continuation, length); } void *allocation = (uint8_t *) arena->allocation + arena->usage; arena->usage += length; return allocation; } char * vx_arena_dupe_string(vx_arena_s *arena, const char *string) { uint32_t len_string = strlen(string); char *string_duplicate = vx_arena_alloc(arena, len_string + 1); memcpy(string_duplicate, string, len_string); return string_duplicate; } char * vx_arena_dupe_string_up_to(vx_arena_s *arena, const char *string, uint32_t maximum) { uint32_t length = vx_measure_string_up_to(string, maximum); char *string_duplicate = vx_arena_alloc(arena, length + 1); memcpy(string_duplicate, string, length); string_duplicate[length] = 0; return string_duplicate; }