1/* $NetBSD: snprintf.c,v 1.5 2020/05/25 20:47:35 christos Exp $ */ 2 3 4#ifndef HAVE_VPRINTF 5#include "choke-me: no vprintf and no snprintf" 6 choke me. 7#endif 8 9#if defined(HAVE_STDARG_H) 10# include <stdarg.h> 11# ifndef VA_START 12# define VA_START(a, f) va_start(a, f) 13# define VA_END(a) va_end(a) 14# endif /* VA_START */ 15# define SNV_USING_STDARG_H 16 17#elif defined(HAVE_VARARGS_H) 18# include <varargs.h> 19# ifndef VA_START 20# define VA_START(a, f) va_start(a) 21# define VA_END(a) va_end(a) 22# endif /* VA_START */ 23# undef SNV_USING_STDARG_H 24 25#else 26# include "must-have-stdarg-or-varargs" 27 choke me. 28#endif 29 30static int 31snprintf(char *str, size_t n, char const *fmt, ...) 32{ 33 va_list ap; 34 int rval; 35 36#ifdef VSPRINTF_CHARSTAR 37 char *rp; 38 VA_START(ap, fmt); 39 rp = vsprintf(str, fmt, ap); 40 VA_END(ap); 41 rval = strlen(rp); 42 43#else 44 VA_START(ap, fmt); 45 rval = vsprintf(str, fmt, ap); 46 VA_END(ap); 47#endif 48 49 if (rval > n) { 50 fprintf(stderr, "snprintf buffer overrun %d > %d\n", rval, (int)n); 51 abort(); 52 } 53 return rval; 54} 55 56static int 57vsnprintf( char *str, size_t n, char const *fmt, va_list ap ) 58{ 59#ifdef VSPRINTF_CHARSTAR 60 return (strlen(vsprintf(str, fmt, ap))); 61#else 62 return (vsprintf(str, fmt, ap)); 63#endif 64} 65