From ff2973eed2c4e9b5ff7b5feabe9b7998ea3206f0 Mon Sep 17 00:00:00 2001 From: Arvid Norlander Date: Wed, 19 Nov 2008 17:40:54 -0500 Subject: [PATCH] Add ick_snprintf_or_die --- src/uncommon.c | 23 +++++++++++++++++++++++ src/uncommon.h | 5 +++++ 2 files changed, 28 insertions(+) diff --git a/src/uncommon.c b/src/uncommon.c index 2ef57c2..0dc93e3 100644 --- a/src/uncommon.c +++ b/src/uncommon.c @@ -21,6 +21,8 @@ LICENSE TERMS #include #include +#include +#include #include "uncommon.h" /* Options that might affect this */ @@ -161,3 +163,24 @@ int ick_printfopens=0; else return NULL; } + +/** + * Invoke snprintf(), if supported. Otherwise invoke sprintf() and abort + * if we did overflow. + */ +int ick_snprintf_or_die(char *str, size_t size, const char *format, ...) +{ + va_list ap; + int retval; + va_start(ap, format); +#ifdef HAVE_SNPRINTF + retval = vsnprintf(str, size, format, ap); +#else + retval = vsprintf(str, format, ap); + /* TODO: Replace with some nice ick_lose(). */ + if (retval >= size) + abort(); +#endif + va_end(ap); + return retval; +} diff --git a/src/uncommon.h b/src/uncommon.h index 2d879cd..3144680 100644 --- a/src/uncommon.h +++ b/src/uncommon.h @@ -6,3 +6,8 @@ /*@null@*/ /*@dependent@*/ extern FILE* ick_findandfopen(/*@observer@*/ const char*, /*@observer@*/ const char*, /*@observer@*/ const char*, /*@observer@*/ const char*); /*@observer@*/ /*@null@*/ extern const char* ick_findandtestopen(/*@observer@*/ const char*, /*@observer@*/ const char*, /*@observer@*/ const char*, /*@observer@*/ const char*); /*@null@*/ /*@dependent@*/ extern FILE* ick_findandfreopen(/*@observer@*/ const char*, /*@observer@*/ const char*, /*@observer@*/ const char*, /*@observer@*/ const char*, FILE*); +extern int ick_snprintf_or_die(char *str, size_t size, const char *format, ...) +#ifdef __GNUC__ + __attribute__ ((format(printf, 3, 4))) +#endif +; -- 2.43.0