diff options
Diffstat (limited to 'include')
-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; |