jrk

my own c stdlib to keep myself sane
git clone git://git.jakekoroman.com/jrk
Log | Files | Refs

commit 59eb2871d7e16708eee84b4b2c80b1bd2f8339ac
parent eb80b3fc5644546f8a06ed1665392b6f90a8a3d5
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Mon, 22 Sep 2025 10:53:16 -0400

add jrk_arena_push_strf.

Diffstat:
Mjrk.h | 75++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 48 insertions(+), 27 deletions(-)

diff --git 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) {