xref: /freebsd/contrib/ntp/sntp/libopts/compat/snprintf.c (revision 416ba5c74546f32a993436a99516d35008e9f384)
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