From d84a94d2f8b119f7c0f98436b0ce8761a2b6b9a6 Mon Sep 17 00:00:00 2001 From: Andrei Alexeyev Date: Sat, 7 Sep 2024 11:19:23 +0200 Subject: [PATCH] util/stringops: add strfmt_arena() --- src/util/stringops.c | 28 ++++++++++++++++++++++++++++ src/util/stringops.h | 7 +++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/util/stringops.c b/src/util/stringops.c index 6d197d3b..8677a52a 100644 --- a/src/util/stringops.c +++ b/src/util/stringops.c @@ -117,6 +117,34 @@ char* strfmt(const char *fmt, ...) { return str; } +char* vstrfmt_arena(MemArena *arena, const char *fmt, va_list args) { + size_t buf_size = strlen(fmt) * 2; + char *buf = marena_alloc(arena, buf_size); + + va_list nargs; + va_copy(nargs, args); + int written = vsnprintf(buf, buf_size, fmt, nargs); + va_end(nargs); + + buf = marena_realloc(arena, buf, buf_size, written + 1); + + if(written >= buf_size) { + buf_size = written + 1; + written = vsnprintf(buf, buf_size, fmt, args); + assert(written == buf_size - 1); + } + + return buf; +} + +char* strfmt_arena(MemArena *arena, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + char *str = vstrfmt_arena(arena, fmt, args); + va_end(args); + return str; +} + char* strftimealloc(const char *fmt, const struct tm *timeinfo) { size_t sz_allocated = 64; diff --git a/src/util/stringops.h b/src/util/stringops.h index 0719aad4..e108da2c 100644 --- a/src/util/stringops.h +++ b/src/util/stringops.h @@ -9,11 +9,12 @@ #pragma once #include "taisei.h" +#include "memory/arena.h" +#include "systime.h" + #include #include -#include "systime.h" - #define UNICODE_UNKNOWN 0xFFFD #define UNICODE_BOM_NATIVE 0xFEFF #define UNICODE_BOM_SWAPPED 0xFFFE @@ -55,6 +56,8 @@ void stralloc(char **dest, const char *src); char* strjoin(const char *first, ...) attr_sentinel attr_returns_allocated; char* vstrfmt(const char *fmt, va_list args) attr_returns_allocated; char* strfmt(const char *fmt, ...) attr_printf(1, 2) attr_returns_allocated; +char* vstrfmt_arena(MemArena *arena, const char *fmt, va_list args) attr_returns_allocated; +char* strfmt_arena(MemArena *arena, const char *fmt, ...) attr_printf(2, 3) attr_returns_allocated; char* strappend(char **dst, const char *src); char* strftimealloc(const char *fmt, const struct tm *timeinfo) attr_returns_allocated; void expand_escape_sequences(char *str);