diff options
author | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2005-01-16 07:28:55 +0300 |
---|---|---|
committer | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2005-01-16 07:28:55 +0300 |
commit | cb289b215faa89e61b57ac00244e455992b85f06 (patch) | |
tree | 3531a1c6cb509bedd912ab7ac767bfcacd7a2155 /intern/moto/include/MT_assert.h | |
parent | 981ecc390a5a04c6c53bf5c0a566cf8e7aac7bee (diff) |
Advanced MT_assert macro.
It will attempt to break into the debugger instead of aborting the program. On Windows you have a nice MessageBox function, so you can choose to break, ignore, or permanently ignore the assert.
Diffstat (limited to 'intern/moto/include/MT_assert.h')
-rw-r--r-- | intern/moto/include/MT_assert.h | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/intern/moto/include/MT_assert.h b/intern/moto/include/MT_assert.h index b9680c1e684..dce57b91272 100644 --- a/intern/moto/include/MT_assert.h +++ b/intern/moto/include/MT_assert.h @@ -38,9 +38,53 @@ #else -#include <assert.h> +#include <signal.h> +#include <stdlib.h> -#define MT_assert(predicate) assert(predicate) +// BREAKPOINT() will cause a break into the debugger +#if defined(__i386) && defined(__GNUC__) +// gcc on intel... +#define BREAKPOINT() \ + asm("int $3") +#elif defined(_MSC_VER) +// Visual C++ (on Intel) +#define BREAKPOINT() \ + { _asm int 3 } +#elif defined(SIGTRAP) +// POSIX compatible... +#define BREAKPOINT() \ + raise(SIGTRAP); +#else +// FIXME: Don't know how to do a decent break! +// Add some code for your cpu type, or get a posix +// system. +// abort instead +#define BREAKPOINT() \ + abort(); +#endif + +// So it can be used from C +#ifdef __cplusplus +#define MT_CDECL extern "C" +#else +#define MT_CDECL +#endif + +// Ask the user if they wish to abort/break, ignore, or ignore for good. +// file, line, predicate form the message to ask, *do_assert should be set +// to 0 to ignore. +// returns 1 to break, false to ignore +MT_CDECL int MT_QueryAssert(char *file, int line, char *predicate, int *do_assert); + +// Abort the program if predicate is not true +#define MT_assert(predicate) \ +{ \ + static int do_assert = 1; \ + if (!(predicate) && MT_QueryAssert(__FILE__, __LINE__, #predicate, &do_assert)) \ + { \ + BREAKPOINT(); \ + } \ +} #endif /* MT_NDEBUG */ |