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