github.com/afumu/libc@v0.0.6/musl/src/stdio/vsnprintf.c (about) 1 #include "stdio_impl.h" 2 #include <limits.h> 3 #include <string.h> 4 #include <errno.h> 5 #include <stdint.h> 6 7 struct cookie { 8 char *s; 9 size_t n; 10 }; 11 12 #define MIN(a, b) ((a) < (b) ? (a) : (b)) 13 14 static size_t sn_write(FILE *f, const unsigned char *s, size_t l) 15 { 16 struct cookie *c = f->cookie; 17 size_t k = MIN(c->n, f->wpos - f->wbase); 18 if (k) { 19 memcpy(c->s, f->wbase, k); 20 c->s += k; 21 c->n -= k; 22 } 23 k = MIN(c->n, l); 24 if (k) { 25 memcpy(c->s, s, k); 26 c->s += k; 27 c->n -= k; 28 } 29 *c->s = 0; 30 f->wpos = f->wbase = f->buf; 31 /* pretend to succeed, even if we discarded extra data */ 32 return l; 33 } 34 35 int vsnprintf(char *restrict s, size_t n, const char *restrict fmt, va_list ap) 36 { 37 unsigned char buf[1]; 38 char dummy[1]; 39 struct cookie c = { .s = n ? s : dummy, .n = n ? n-1 : 0 }; 40 FILE f = { 41 .lbf = EOF, 42 .write = sn_write, 43 .lock = -1, 44 .buf = buf, 45 .cookie = &c, 46 }; 47 48 if (n > INT_MAX) { 49 errno = EOVERFLOW; 50 return -1; 51 } 52 53 *c.s = 0; 54 return vfprintf(&f, fmt, ap); 55 }