00001
00002
00003
00004
00005
00006
00007 #ifndef __WVASSERT_H
00008 #define __WVASSERT_H
00009
00010 #include <assert.h>
00011
00012 #include "wvcrash.h"
00013 #include "wvstring.h"
00014
00015
00016
00017
00018
00019
00020
00021
00022 class WvCrashWill
00023 {
00024 public:
00025
00026 WvCrashWill(const char *will);
00027 WvCrashWill(WVSTRING_FORMAT_DECL);
00028
00029
00030 ~WvCrashWill();
00031
00032
00033 void rewrite(const char *will);
00034 void rewrite(WVSTRING_FORMAT_DECL);
00035 private:
00036 WvString old_will;
00037 };
00038
00039 #if !defined(__GLIBC__)
00040
00041 # define wvassert(expr, args...) assert(expr)
00042 # define wvassert_perror(errnum) perror(errnum)
00043
00044 #elif defined(NDEBUG)
00045
00046 # define wvassert(expr, args...) (__ASSERT_VOID_CAST (0))
00047 # define wvassert_perror(errnum) (__ASSERT_VOID_CAST (0))
00048
00049 #else // Not NDEBUG
00050
00051 static inline void __wvcrash_leave_will()
00052 {
00053 }
00054
00055 static inline void __wvcrash_leave_will(const char *will)
00056 {
00057 wvcrash_leave_will(will);
00058 }
00059
00060 static inline void __wvcrash_leave_will(WVSTRING_FORMAT_DECL)
00061 {
00062 wvcrash_leave_will(WvFastString(WVSTRING_FORMAT_CALL));
00063 }
00064
00065
00066
00067
00068
00069 # define wvassert(expr, args...) \
00070 (__ASSERT_VOID_CAST ((expr) ? 0 : \
00071 (__wvcrash_leave_will (args), \
00072 (__assert_fail (__STRING(expr), __FILE__, __LINE__, \
00073 __ASSERT_FUNCTION), 0))))
00074
00075
00076
00077
00078
00079 # define wvassert_perror(errnum, args...) \
00080 (__ASSERT_VOID_CAST (!(errnum) ? 0 : \
00081 (__wvcrash_leave_will (args), \
00082 (__assert_perror_fail ((errnum), __FILE__, __LINE__, \
00083 __ASSERT_FUNCTION), 0))))
00084
00085 #endif // NDEBUG
00086
00087 #endif // WVASSERT_H