-// ----------------------------------------------------------------------------
-// $Id$
-// ----------------------------------------------------------------------------
-// Public Domain C Library - http://pdclib.sourceforge.net
-// This code is Public Domain. Use, modify, and redistribute at will.
-// ----------------------------------------------------------------------------
-// Provides the debug macro assert().
-// ----------------------------------------------------------------------------
+/* $Id$ */
-#ifndef __ASSERT_H
-#define __ASSERT_H __ASSERT_H
+/* 7.2 Diagnostics <assert.h>
-// ----------------------------------------------------------------------------
-// AUXILIARY
+ This file is part of the Public Domain C Library (PDCLib).
+ Permission is granted to use, modify, and / or redistribute at will.
+*/
-// Helper function doing the print to stderr and call to abort().
-void __assert( char const * const expression, // the tested expression
- char const * const file, // name of source file
- char const * const function, // name of function
- int const line ); // number of source file line
+#ifndef _PDCLIB_ASSERT_H
+#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H
+#include <_PDCLIB_aux.h>
+#include <_PDCLIB_config.h>
+_PDCLIB_BEGIN_EXTERN_C
-// ----------------------------------------------------------------------------
-// DEFINES
-
-// TODO: <void expression> is given as (void) 0, which might give a "C style
-// cast" warning under C++. Find a void expression that does not give warnings.
-
-// TODO: Check the macro for if-compatibility.
+/* 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
-#if defined NDEBUG
-#define assert( x ) <void expression>
+
+#ifdef NDEBUG
+#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( x ) ( x ) ? <void expression> \
- : __assert( #x, __FILE__, __func__, __LINE__ )
+#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
#endif
-#endif // __ASSERT_H