diff options
author | justanothercatgirl <sotov@twistea.su> | 2025-03-27 12:51:35 +0300 |
---|---|---|
committer | justanothercatgirl <sotov@twistea.su> | 2025-03-27 12:51:35 +0300 |
commit | 08b786a6770c172f433e28b0eb1e893f4fbae40a (patch) | |
tree | 9e42fc1e8c2abc7d7bccd941c23e0a2de25efa04 /include/jacson.h | |
parent | 3888dc49b9bcab74b1ec3ed88d921236628f99c3 (diff) |
Added __vrsnprintf
Diffstat (limited to 'include/jacson.h')
-rw-r--r-- | include/jacson.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/include/jacson.h b/include/jacson.h index aca103b..2dc7369 100644 --- a/include/jacson.h +++ b/include/jacson.h @@ -145,6 +145,7 @@ bool jacson_try_get_to(jacson_value *obj, enum jacson_type type, void *mem); #ifdef JACSON_EXPORT_RSNPRINTF size_t __jacson_rsnprintf(char **str, size_t *strsz, size_t off, const char *fmt, ...); +size_t __jacson_vrsnprintf(char **str, size_t *strsz, size_t off, const char *fmt, va_list ls); size_t __jacson_rsnputc(char **str, size_t *strsz, size_t off, char c); #endif // JACSON_EXPORT_RSNPRINTF @@ -225,6 +226,21 @@ try_write: va_end(ls); return ln; } +size_t __jacson_vrsnprintf(char **const str, size_t *strsz, size_t off, const char *fmt, va_list ls) { + va_list ls1; + size_t ln; +try_write: + va_copy(ls1, ls); + ln = vsnprintf(*str + off, *strsz-off, fmt, ls1); + va_end(ls1); + if (ln >= *strsz-off) { + *strsz <<= 1; + *str = realloc(*str, *strsz); + goto try_write; + } + va_end(ls); + return ln; +} size_t __jacson_rsnputc(char **const str, size_t *strsz, size_t off, char c) { if (*strsz - off <= 1) { *strsz <<= 1; |