X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=includes%2Fassert.h;h=0d06472fbdaac089c85cd8c6ad5715460c669e78;hb=6608f7d9a9a3326666d825de38fdd216a9ddf049;hp=d5d61ecc606b5c8a1bef80faab2ac6e1c8691f6a;hpb=4c805021b487dff9bfc6341c998ba99636416ae7;p=pdclib diff --git a/includes/assert.h b/includes/assert.h index d5d61ec..0d06472 100644 --- a/includes/assert.h +++ b/includes/assert.h @@ -1,51 +1,69 @@ /* $Id$ */ -/* Release $Name$ */ - /* 7.2 Diagnostics This file is part of the Public Domain C Library (PDCLib). Permission is granted to use, modify, and / or redistribute at will. */ -#ifndef _PDCLIB_AUX_H -#define _PDCLIB_AUX_H _PDCLIB_AUX_H #include <_PDCLIB_aux.h> -#endif - -#ifndef _PDCLIB_CONFIG_H -#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H #include <_PDCLIB_config.h> -#endif + +/* + Defines a macro assert() that, depending on the value of the preprocessor + symbol NDEBUG, does + * evaluate to a void expression if NDEBUG is set OR the parameter expression + evaluates to true; + * print an error message and terminates the program if NDEBUG is not set AND + the parameter expression evaluates to false. + The error message contains the parameter expression, name of the source file + (__FILE__), line number (__LINE__), and (from C99 onward) name of the function + (__func__). + The header can be included MULTIPLE times, and redefines the macro depending + on the current setting of NDEBUG. +*/ + +_PDCLIB_BEGIN_EXTERN_C #ifndef _PDCLIB_ASSERT_H #define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H -#if _PDCLIB_C_VERSION == 99 -void _PDCLIB_assert( char const * const, char const * const, char const * const ); -#else -void _PDCLIB_assert( char const * const ); -#endif + +/* Functions _NOT_ tagged noreturn as this hampers debugging */ +void _PDCLIB_assert99( char const * const, char const * const, char const * const ); +void _PDCLIB_assert89( char const * const ); + #endif /* If NDEBUG is set, assert() is a null operation. */ #undef assert #ifdef NDEBUG -#define assert( ignore ) ( (void) 0 ) -#else -#if _PDCLIB_C_VERSION == 99 -#define assert( expression ) ( ( expression ) ? (void) 0 \ - : _PDCLIB_assert( "Assertion failed: " #expression \ - ", function ", __func__, \ - ", file " __FILE__ \ - ", line " _PDCLIB_symbol2string( __LINE__ ) \ - "." _PDCLIB_endl ) ) +#define assert( ignore ) do { \ + if(!(expression)) { _PDCLIB_UNREACHABLE; } \ + } while(0) + +#elif _PDCLIB_C_MIN(99) +#define assert(expression) \ + do { if(!(expression)) { \ + _PDCLIB_assert99("Assertion failed: " _PDCLIB_symbol2string(expression)\ + ", function ", __func__, \ + ", file " __FILE__ \ + ", line " _PDCLIB_symbol2string( __LINE__ ) \ + "." _PDCLIB_endl ); \ + _PDCLIB_UNREACHABLE; \ + } \ + } while(0) + #else -#define assert( expression ) ( ( expression ) ? (void) 0 \ - : _PDCLIB_assert( "Assertion failed: " #expression \ - ", file " __FILE__ \ - ", line " _PDCLIB_symbol2string( __LINE__ ) \ - "." _PDCLIB_endl ) ) -#endif +#define assert(expression) \ + do { if(!(expression)) { \ + _PDCLIB_assert89("Assertion failed: " _PDCLIB_symbol2string(expression)\ + ", file " __FILE__ \ + ", line " _PDCLIB_symbol2string( __LINE__ ) \ + "." _PDCLIB_endl ); \ + _PDCLIB_UNREACHABLE; \ + } \ + } while(0) #endif +_PDCLIB_END_EXTERN_C