diff --git a/XAlloc.c b/XAlloc.c index 010d761d7b75ff5d2131d6c3b8785836fcc28f1a..5bda74edbc2971969595a350370bc25e301dc830 100644 --- a/XAlloc.c +++ b/XAlloc.c @@ -5,6 +5,7 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#include #include #include #include @@ -43,7 +44,19 @@ void* xRealloc(void* ptr, size_t size) { return data; } -char* xStrdup(const char* str) { +#undef xStrdup +#undef xStrdup_ +#ifdef NDEBUG +# define xStrdup_ xStrdup +#else +# define xStrdup(str_) (assert(str_), xStrdup_(str_)) +#endif + +#if ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) +char* xStrdup_(const char* str) __attribute__((nonnull)); +#endif // GNU C 3.3 or later + +char* xStrdup_(const char* str) { char* data = strdup(str); if (!data) { fail(); diff --git a/XAlloc.h b/XAlloc.h index 3cc060d994f9354bb68c7d3ef0167285c7b6f8c6..22a6e8ab425f07108bc0d3147a6d66bf379585b8 100644 --- a/XAlloc.h +++ b/XAlloc.h @@ -15,6 +15,18 @@ void* xCalloc(size_t nmemb, size_t size); void* xRealloc(void* ptr, size_t size); -char* xStrdup(const char* str); +#undef xStrdup +#undef xStrdup_ +#ifdef NDEBUG +# define xStrdup_ xStrdup +#else +# define xStrdup(str_) (assert(str_), xStrdup_(str_)) +#endif + +#if ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) +char* xStrdup_(const char* str) __attribute__((nonnull)); +#endif // GNU C 3.3 or later + +char* xStrdup_(const char* str); #endif