2011-02-12 00:22:29 -05:00
|
|
|
#include "stdio_impl.h"
|
|
|
|
|
|
|
|
static size_t sn_write(FILE *f, const unsigned char *s, size_t l)
|
|
|
|
{
|
|
|
|
/* pretend to succeed, but discard data */
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
|
|
|
|
int vsnprintf(char *s, size_t n, const char *fmt, va_list ap)
|
|
|
|
{
|
|
|
|
int r;
|
|
|
|
FILE f;
|
|
|
|
unsigned char buf[1];
|
|
|
|
|
|
|
|
memset(&f, 0, sizeof(FILE));
|
|
|
|
f.lbf = EOF;
|
|
|
|
f.write = sn_write;
|
|
|
|
f.buf_size = 1;
|
|
|
|
f.buf = buf;
|
2011-03-24 23:16:52 -04:00
|
|
|
f.lock = -1;
|
2011-02-12 00:22:29 -05:00
|
|
|
if (n > INT_MAX) {
|
|
|
|
errno = EOVERFLOW;
|
|
|
|
return -1;
|
|
|
|
} else if (n > 0) {
|
|
|
|
if (n > (char *)0+SIZE_MAX-s) n = (char *)0+SIZE_MAX-s;
|
2011-03-25 16:34:03 -04:00
|
|
|
f.wpos = (void *)s;
|
|
|
|
f.wbase = f.wend = (void *)(s+n-1);
|
2011-02-12 00:22:29 -05:00
|
|
|
f.wstop = f.wend - 1;
|
|
|
|
}
|
|
|
|
r = vfprintf(&f, fmt, ap);
|
|
|
|
/* wpos points just after last byte written, or to s+n-1 (wbase) */
|
|
|
|
*f.wpos = 0;
|
|
|
|
return r;
|
|
|
|
}
|