Permission is granted to use, modify, and / or redistribute at will.
*/
-#ifndef _PDCLIB_AUX_H
-#define _PDCLIB_AUX_H _PDCLIB_AUX_H
+#ifndef _PDCLIB_ASSERT_H
+#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H
#include <_PDCLIB_aux.h>
-#endif
-
-#ifndef _PDCLIB_CONFIG_H
-#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H
#include <_PDCLIB_config.h>
-#endif
+_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
-#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 );
/* If NDEBUG is set, assert() is a null operation. */
#undef assert
#ifdef NDEBUG
#define assert( ignore ) ( (void) 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 ); \
+ } \
+ } while(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 ) )
-#else
-#define assert( expression ) ( ( expression ) ? (void) 0 \
- : _PDCLIB_assert( "Assertion failed: " #expression \
- ", file " __FILE__ \
- ", line " _PDCLIB_symbol2string( __LINE__ ) \
- "." _PDCLIB_endl ) )
+#define assert(expression) \
+ do { if(!(expression)) { \
+ _PDCLIB_assert89("Assertion failed: " _PDCLIB_symbol2string(expression)\
+ ", file " __FILE__ \
+ ", line " _PDCLIB_symbol2string( __LINE__ ) \
+ "." _PDCLIB_endl ); \
+ } \
+ } while(0)
#endif
+
+_PDCLIB_END_EXTERN_C
#endif