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