22f6b6a555c3e44596e6625ae18c07b81d348f0e
[blender-staging.git] / intern / moto / include / MT_assert.h
1 /**
2 * $Id$
3 * ***** BEGIN GPL LICENSE BLOCK *****
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 *
19 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20 * All rights reserved.
21 *
22 * The Original Code is: all of this file.
23 *
24 * Contributor(s): none yet.
25 *
26 * ***** END GPL LICENSE BLOCK *****
27 */
28
29 #ifndef MT_ASSERT_H
30 #define MT_ASSERT_H
31
32 #include <signal.h>
33 #include <stdlib.h>
34 #include <assert.h>
35
36
37 // So it can be used from C
38 #ifdef __cplusplus
39 #define MT_CDECL extern "C"
40 #else
41 #define MT_CDECL
42 #endif
43
44 // Ask the user if they wish to abort/break, ignore, or ignore for good.
45 // file, line, predicate form the message to ask, *do_assert should be set
46 // to 0 to ignore.
47 // returns 1 to break, false to ignore
48 MT_CDECL int MT_QueryAssert(const char *file, int line, const char *predicate, int *do_assert);
49
50
51 #ifdef  NDEBUG
52 #define MT_assert(predicate) ((void)0)
53 #define BREAKPOINT() ((void)0)
54 #else 
55
56 // BREAKPOINT() will cause a break into the debugger
57 #if defined(__i386) && defined(__GNUC__)
58 // gcc on intel...
59 #define BREAKPOINT() \
60 asm("int $3")
61 #elif defined(_MSC_VER)
62 // Visual C++ (on Intel)
63 #define BREAKPOINT() \
64 { _asm int 3 }
65 #elif defined(SIGTRAP)
66 // POSIX compatible...
67 #define BREAKPOINT() \
68 raise(SIGTRAP);
69 #else
70 // FIXME: Don't know how to do a decent break!
71 // Add some code for your cpu type, or get a posix
72 // system.
73 // abort instead
74 #define BREAKPOINT() \
75 abort();
76 #endif /* breakpoint */
77
78
79 #if defined(WIN32) && !defined(__GNUC__)
80 #define MT_assert(predicate) assert(predicate)
81 #else
82
83
84
85 // Abort the program if predicate is not true
86 #define MT_assert(predicate)                                                                    \
87 {                                                                                               \
88         static int do_assert = 1;                                                               \
89         if (!(predicate) && MT_QueryAssert(__FILE__, __LINE__, #predicate, &do_assert))         \
90         {                                                                                       \
91                 BREAKPOINT();                                                                   \
92         }                                                                                       \
93 }
94 #endif /* windows */
95
96 #endif /* NDEBUG */
97
98 #endif
99