37 lines
669 B
C
37 lines
669 B
C
#include <stdio.h>
|
|
#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;
|
|
}
|