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