#include #include "__printf.h" struct __vsnprintf_arg { char *buf; size_t idx; size_t max; }; static void _out_buf(struct __printf_backend *bk, char ch) { struct __vsnprintf_arg *arg = bk->arg; if (arg->idx < arg->max) { arg->buf[arg->idx] = ch; } arg->idx++; } int vsnprintf(char *buf, size_t sz, const char *restrict format, va_list arg) { struct __vsnprintf_arg bk_arg = {}; bk_arg.buf = buf; bk_arg.max = sz; struct __printf_backend bk = {}; bk.out = _out_buf; bk.arg = &bk_arg; __xprintf(&bk, format, arg); if (!bk_arg.idx) { return 0; } return bk_arg.idx - 1; }