return jv_string_append_buf(a, str, strlen(str));
}
-jv jv_string_fmt(const char* fmt, ...) {
+jv jv_string_vfmt(const char* fmt, va_list ap) {
int size = 1024;
while (1) {
char* buf = jv_mem_alloc(size);
- va_list args;
- va_start(args, fmt);
- int n = vsnprintf(buf, size, fmt, args);
- va_end(args);
+ va_list ap2;
+ va_copy(ap2, ap);
+ int n = vsnprintf(buf, size, fmt, ap2);
+ va_end(ap2);
if (n < size) {
jv ret = jv_string_sized(buf, n);
jv_mem_free(buf);
}
}
+jv jv_string_fmt(const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ jv res = jv_string_vfmt(fmt, args);
+ va_end(args);
+ return res;
+}
+
/*
* Objects (internal helpers)
*/
#ifndef JV_H
#define JV_H
+#include <stdarg.h>
#include <stdint.h>
typedef enum {
const char* jv_string_value(jv);
jv jv_string_slice(jv j, int start, int end);
jv jv_string_concat(jv, jv);
+jv jv_string_vfmt(const char*, va_list);
jv jv_string_fmt(const char*, ...);
jv jv_string_append_codepoint(jv a, uint32_t c);
jv jv_string_append_buf(jv a, const char* buf, int len);