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