aboutsummaryrefslogtreecommitdiffstats
path: root/include/jacson.h
diff options
context:
space:
mode:
authorjustanothercatgirl <sotov@twistea.su>2025-03-27 12:51:35 +0300
committerjustanothercatgirl <sotov@twistea.su>2025-03-27 12:51:35 +0300
commit08b786a6770c172f433e28b0eb1e893f4fbae40a (patch)
tree9e42fc1e8c2abc7d7bccd941c23e0a2de25efa04 /include/jacson.h
parent3888dc49b9bcab74b1ec3ed88d921236628f99c3 (diff)
Added __vrsnprintf
Diffstat (limited to 'include/jacson.h')
-rw-r--r--include/jacson.h16
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;