From 59eb2871d7e16708eee84b4b2c80b1bd2f8339ac Mon Sep 17 00:00:00 2001 From: Jake Koroman Date: Mon, 22 Sep 2025 10:53:16 -0400 Subject: add jrk_arena_push_strf. --- jrk.h | 75 +++++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 27 deletions(-) (limited to 'jrk.h') diff --git a/jrk.h b/jrk.h index 02cee64..e20d802 100644 --- a/jrk.h +++ b/jrk.h @@ -64,6 +64,7 @@ void *jrk_erealloc(void*, u64); jrk_Arena jrk_arena_create(u8*, u64); void *jrk_arena_push(jrk_Arena*, u64); +char *jrk_arena_push_strf(jrk_Arena*, char*, ...); void jrk_arena_reset(jrk_Arena*); void *jrk_arena_resize(jrk_Arena*, void*, u64, u64); @@ -112,35 +113,35 @@ char *jrk_tmpstrings_pushf(char *, ...); #define jrk_sb_to_sv(sb) jrk_sv_from_parts((sb).items, (sb).count) #define JRK_DA_DEFAULT_INIT_CAPACITY 16 -#define jrk_da_reserve(da, expected_capacity) \ - do { \ - if ((expected_capacity) > (da)->capacity) { \ - if ((da)->capacity == 0) { \ - (da)->capacity = JRK_DA_DEFAULT_INIT_CAPACITY; \ - } \ - while ((expected_capacity) > (da)->capacity) { \ - (da)->capacity *= 2; \ - } \ - (da)->items = jrk_erealloc((da)->items, (da)->capacity * sizeof(*(da)->items)); \ - } \ +#define jrk_da_reserve(da, expected_capacity) \ + do { \ + if ((expected_capacity) > (da)->capacity) { \ + if ((da)->capacity == 0) { \ + (da)->capacity = (expected_capacity) ? (expected_capacity) : JRK_DA_DEFAULT_INIT_CAPACITY; \ + } \ + while ((expected_capacity) > (da)->capacity) { \ + (da)->capacity *= 2; \ + } \ + (da)->items = jrk_erealloc((da)->items, (da)->capacity * sizeof(*(da)->items)); \ + } \ } while (0) -#define jrk_arena_da_reserve(arena, da, expected_capacity) \ - do { \ - if ((da)->capacity == 0) { \ - (da)->capacity = JRK_DA_DEFAULT_INIT_CAPACITY; \ - (da)->items = jrk_arena_push(arena, (da)->capacity * sizeof(*(da)->items)); \ - break; \ - } \ - if ((expected_capacity) > (da)->capacity) { \ - u64 old_cap = (da)->capacity; \ - while ((expected_capacity) > (da)->capacity) { \ - (da)->capacity *= 2; \ - } \ - u64 old_size = old_cap * sizeof(*(da)->items); \ - u64 new_size = (da)->capacity * sizeof(*(da)->items); \ - (da)->items = jrk_arena_resize((arena), (da)->items, old_size, new_size); \ - } \ +#define jrk_arena_da_reserve(arena, da, expected_capacity) \ + do { \ + if ((da)->capacity == 0) { \ + (da)->capacity = (expected_capacity) ? (expected_capacity) : JRK_DA_DEFAULT_INIT_CAPACITY; \ + (da)->items = jrk_arena_push(arena, (da)->capacity * sizeof(*(da)->items)); \ + break; \ + } \ + if ((expected_capacity) > (da)->capacity) { \ + u64 old_cap = (da)->capacity; \ + while ((expected_capacity) > (da)->capacity) { \ + (da)->capacity *= 2; \ + } \ + u64 old_size = old_cap * sizeof(*(da)->items); \ + u64 new_size = (da)->capacity * sizeof(*(da)->items); \ + (da)->items = jrk_arena_resize((arena), (da)->items, old_size, new_size); \ + } \ } while (0) #define jrk_arena_da_append(arena, da, item) \ @@ -258,6 +259,7 @@ char *jrk_tmpstrings_pushf(char *, ...); #define arena_create jrk_arena_create #define arena_push jrk_arena_push + #define arena_push_strf jrk_arena_push_strf #define arena_resize jrk_arena_resize #define arena_reset jrk_arena_reset @@ -393,6 +395,25 @@ jrk_arena_push(jrk_Arena *arena, u64 n) return result; } +char * +jrk_arena_push_strf(jrk_Arena *arena, char *fmt, ...) +{ + char *result = NULL; + + va_list args; + va_start(args, fmt); + i32 n = vsnprintf(NULL, 0, fmt, args); + va_end(args); + + result = jrk_arena_push(arena, (u64) n + 1); + + va_start(args, fmt); + vsnprintf(result, n + 1, fmt, args); + va_end(args); + + return result; +} + void * jrk_arena_resize(jrk_Arena *arena, void *old, u64 old_size, u64 new_size) { -- cgit v1.2.3