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:
M | jrk.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)
{