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