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