snprintf.c revision 290001
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
28static int
29snprintf(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
54static int
55vsnprintf( 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}
63