X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=includes%2Fassert.h;h=cb5c47e4bd2875ba8e1874c96c6e6b7c951d0562;hb=a60e344c2f266002ae7cd40ddc12d3f8263a8be9;hp=e03baaaae87c66a5adc653f084be53591eee99a1;hpb=15e3f8a309359e62810df3cd1dafaf77481452a2;p=pdclib.old diff --git a/includes/assert.h b/includes/assert.h index e03baaa..cb5c47e 100644 --- a/includes/assert.h +++ b/includes/assert.h @@ -1,35 +1,53 @@ -// ---------------------------------------------------------------------------- -// $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 -// ---------------------------------------------------------------------------- -// 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: 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) 0 + +#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) 0 \ - : __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