1ea906c41SOllivier Robert
2ea906c41SOllivier Robert #ifndef HAVE_VPRINTF
3ea906c41SOllivier Robert #include "choke-me: no vprintf and no snprintf"
4*2b15cb3dSCy Schubert choke me.
5ea906c41SOllivier Robert #endif
6ea906c41SOllivier Robert
7ea906c41SOllivier Robert #if defined(HAVE_STDARG_H)
8ea906c41SOllivier Robert # include <stdarg.h>
9ea906c41SOllivier Robert # ifndef VA_START
10ea906c41SOllivier Robert # define VA_START(a, f) va_start(a, f)
11ea906c41SOllivier Robert # define VA_END(a) va_end(a)
12ea906c41SOllivier Robert # endif /* VA_START */
13ea906c41SOllivier Robert # define SNV_USING_STDARG_H
14ea906c41SOllivier Robert
15ea906c41SOllivier Robert #elif defined(HAVE_VARARGS_H)
16ea906c41SOllivier Robert # include <varargs.h>
17ea906c41SOllivier Robert # ifndef VA_START
18ea906c41SOllivier Robert # define VA_START(a, f) va_start(a)
19ea906c41SOllivier Robert # define VA_END(a) va_end(a)
20ea906c41SOllivier Robert # endif /* VA_START */
21ea906c41SOllivier Robert # undef SNV_USING_STDARG_H
22ea906c41SOllivier Robert
23ea906c41SOllivier Robert #else
24ea906c41SOllivier Robert # include "must-have-stdarg-or-varargs"
25*2b15cb3dSCy Schubert choke me.
26ea906c41SOllivier Robert #endif
27ea906c41SOllivier Robert
28ea906c41SOllivier Robert static int
snprintf(char * str,size_t n,char const * fmt,...)29ea906c41SOllivier Robert snprintf(char *str, size_t n, char const *fmt, ...)
30ea906c41SOllivier Robert {
31ea906c41SOllivier Robert va_list ap;
32ea906c41SOllivier Robert int rval;
33ea906c41SOllivier Robert
34ea906c41SOllivier Robert #ifdef VSPRINTF_CHARSTAR
35ea906c41SOllivier Robert char *rp;
36ea906c41SOllivier Robert VA_START(ap, fmt);
37ea906c41SOllivier Robert rp = vsprintf(str, fmt, ap);
38ea906c41SOllivier Robert VA_END(ap);
39ea906c41SOllivier Robert rval = strlen(rp);
40ea906c41SOllivier Robert
41ea906c41SOllivier Robert #else
42ea906c41SOllivier Robert VA_START(ap, fmt);
43ea906c41SOllivier Robert rval = vsprintf(str, fmt, ap);
44ea906c41SOllivier Robert VA_END(ap);
45ea906c41SOllivier Robert #endif
46ea906c41SOllivier Robert
47ea906c41SOllivier Robert if (rval > n) {
48ea906c41SOllivier Robert fprintf(stderr, "snprintf buffer overrun %d > %d\n", rval, (int)n);
49ea906c41SOllivier Robert abort();
50ea906c41SOllivier Robert }
51ea906c41SOllivier Robert return rval;
52ea906c41SOllivier Robert }
53ea906c41SOllivier Robert
54ea906c41SOllivier Robert static int
vsnprintf(char * str,size_t n,char const * fmt,va_list ap)55ea906c41SOllivier Robert vsnprintf( char *str, size_t n, char const *fmt, va_list ap )
56ea906c41SOllivier Robert {
57ea906c41SOllivier Robert #ifdef VSPRINTF_CHARSTAR
58ea906c41SOllivier Robert return (strlen(vsprintf(str, fmt, ap)));
59ea906c41SOllivier Robert #else
60ea906c41SOllivier Robert return (vsprintf(str, fmt, ap));
61ea906c41SOllivier Robert #endif
62ea906c41SOllivier Robert }
63