comparison touchTest/Iphone Test/touchTestIPhone2/touchTestIPhone/include/SDL_assert.h @ 4677:31607094315c

Added Iphone project. Iphone multi-touch is now functional.
author jimtla
date Sat, 31 Jul 2010 01:24:50 +0400
parents
children
comparison
equal deleted inserted replaced
4676:99b4560b7aa1 4677:31607094315c
1 /*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2010 Sam Lantinga
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library 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 GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Sam Lantinga
20 slouken@libsdl.org
21 */
22
23 #ifndef _SDL_assert_h
24 #define _SDL_assert_h
25
26 #include "SDL_config.h"
27
28 #include "begin_code.h"
29 /* Set up for C function definitions, even when using C++ */
30 #ifdef __cplusplus
31 /* *INDENT-OFF* */
32 extern "C" {
33 /* *INDENT-ON* */
34 #endif
35
36 #ifndef SDL_ASSERT_LEVEL
37 #ifdef SDL_DEFAULT_ASSERT_LEVEL
38 #define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL
39 #elif defined(_DEBUG) || defined(DEBUG) || \
40 (defined(__GNUC__) && !defined(__OPTIMIZE__))
41 #define SDL_ASSERT_LEVEL 2
42 #else
43 #define SDL_ASSERT_LEVEL 1
44 #endif
45 #endif /* SDL_ASSERT_LEVEL */
46
47 /*
48 These are macros and not first class functions so that the debugger breaks
49 on the assertion line and not in some random guts of SDL, and so each
50 assert can have unique static variables associated with it.
51 */
52
53 #if (defined(_MSC_VER) && ((_M_IX86) || (_M_X64)))
54 #define SDL_TriggerBreakpoint() __asm { int 3 }
55 #elif (defined(__GNUC__) && ((__i386__) || (__x86_64__)))
56 #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" )
57 #elif defined(HAVE_SIGNAL_H)
58 #include <signal.h>
59 #define SDL_TriggerBreakpoint() raise(SIGTRAP)
60 #else
61 /* How do we trigger breakpoints on this platform? */
62 #define SDL_TriggerBreakpoint()
63 #endif
64
65 #if (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */
66 # define SDL_FUNCTION __func__
67 #elif ((__GNUC__ >= 2) || defined(_MSC_VER))
68 # define SDL_FUNCTION __FUNCTION__
69 #else
70 # define SDL_FUNCTION "???"
71 #endif
72 #define SDL_FILE __FILE__
73 #define SDL_LINE __LINE__
74
75 /*
76 sizeof (x) makes the compiler still parse the expression even without
77 assertions enabled, so the code is always checked at compile time, but
78 doesn't actually generate code for it, so there are no side effects or
79 expensive checks at run time, just the constant size of what x WOULD be,
80 which presumably gets optimized out as unused.
81 This also solves the problem of...
82
83 int somevalue = blah();
84 SDL_assert(somevalue == 1);
85
86 ...which would cause compiles to complain that somevalue is unused if we
87 disable assertions.
88 */
89
90 #define SDL_disabled_assert(condition) \
91 do { (void) sizeof ((condition)); } while (0)
92
93 #if (SDL_ASSERT_LEVEL > 0)
94
95 typedef enum
96 {
97 SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */
98 SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */
99 SDL_ASSERTION_ABORT, /**< Terminate the program. */
100 SDL_ASSERTION_IGNORE, /**< Ignore the assert. */
101 SDL_ASSERTION_ALWAYS_IGNORE, /**< Ignore the assert from now on. */
102 } SDL_assert_state;
103
104 typedef struct SDL_assert_data
105 {
106 int always_ignore;
107 unsigned int trigger_count;
108 const char *condition;
109 const char *filename;
110 int linenum;
111 const char *function;
112 const struct SDL_assert_data *next;
113 } SDL_assert_data;
114
115 /* Never call this directly. Use the SDL_assert* macros. */
116 extern DECLSPEC SDL_assert_state SDLCALL SDL_ReportAssertion(SDL_assert_data *,
117 const char *,
118 const char *, int);
119
120 /* the do {} while(0) avoids dangling else problems:
121 if (x) SDL_assert(y); else blah();
122 ... without the do/while, the "else" could attach to this macro's "if".
123 We try to handle just the minimum we need here in a macro...the loop,
124 the static vars, and break points. The heavy lifting is handled in
125 SDL_ReportAssertion(), in SDL_assert.c.
126 */
127 #define SDL_enabled_assert(condition) \
128 do { \
129 while ( !(condition) ) { \
130 static struct SDL_assert_data assert_data = { \
131 0, 0, #condition, 0, 0, 0, 0 \
132 }; \
133 const SDL_assert_state state = SDL_ReportAssertion(&assert_data, \
134 SDL_FUNCTION, \
135 SDL_FILE, \
136 SDL_LINE); \
137 if (state == SDL_ASSERTION_RETRY) { \
138 continue; /* go again. */ \
139 } else if (state == SDL_ASSERTION_BREAK) { \
140 SDL_TriggerBreakpoint(); \
141 } \
142 break; /* not retrying. */ \
143 } \
144 } while (0)
145
146 #endif /* enabled assertions support code */
147
148 /* Enable various levels of assertions. */
149 #if SDL_ASSERT_LEVEL == 0 /* assertions disabled */
150 # define SDL_assert(condition) SDL_disabled_assert(condition)
151 # define SDL_assert_release(condition) SDL_disabled_assert(condition)
152 # define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
153 #elif SDL_ASSERT_LEVEL == 1 /* release settings. */
154 # define SDL_assert(condition) SDL_disabled_assert(condition)
155 # define SDL_assert_release(condition) SDL_enabled_assert(condition)
156 # define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
157 #elif SDL_ASSERT_LEVEL == 2 /* normal settings. */
158 # define SDL_assert(condition) SDL_enabled_assert(condition)
159 # define SDL_assert_release(condition) SDL_enabled_assert(condition)
160 # define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
161 #elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */
162 # define SDL_assert(condition) SDL_enabled_assert(condition)
163 # define SDL_assert_release(condition) SDL_enabled_assert(condition)
164 # define SDL_assert_paranoid(condition) SDL_enabled_assert(condition)
165 #else
166 # error Unknown assertion level.
167 #endif
168
169
170 typedef SDL_assert_state (SDLCALL *SDL_AssertionHandler)(
171 const SDL_assert_data *, void *userdata);
172
173 /**
174 * \brief Set an application-defined assertion handler.
175 *
176 * This allows an app to show its own assertion UI and/or force the
177 * response to an assertion failure. If the app doesn't provide this, SDL
178 * will try to do the right thing, popping up a system-specific GUI dialog,
179 * and probably minimizing any fullscreen windows.
180 *
181 * This callback may fire from any thread, but it runs wrapped in a mutex, so
182 * it will only fire from one thread at a time.
183 *
184 * Setting the callback to NULL restores SDL's original internal handler.
185 *
186 * This callback is NOT reset to SDL's internal handler upon SDL_Quit()!
187 *
188 * \return SDL_assert_state value of how to handle the assertion failure.
189 *
190 * \param handler Callback function, called when an assertion fails.
191 * \param userdata A pointer passed to the callback as-is.
192 */
193 extern DECLSPEC void SDLCALL SDL_SetAssertionHandler(
194 SDL_AssertionHandler handler,
195 void *userdata);
196
197 /**
198 * \brief Get a list of all assertion failures.
199 *
200 * Get all assertions triggered since last call to SDL_ResetAssertionReport(),
201 * or the start of the program.
202 *
203 * The proper way to examine this data looks something like this:
204 *
205 * <code>
206 * const SDL_assert_data *item = SDL_GetAssertionReport();
207 * while (item->condition) {
208 * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\n",
209 * item->condition, item->function, item->filename,
210 * item->linenum, item->trigger_count,
211 * item->always_ignore ? "yes" : "no");
212 * item = item->next;
213 * }
214 * </code>
215 *
216 * \return List of all assertions. This never returns NULL,
217 * even if there are no items.
218 * \sa SDL_ResetAssertionReport
219 */
220 extern DECLSPEC const SDL_assert_data * SDLCALL SDL_GetAssertionReport(void);
221
222 /**
223 * \brief Reset the list of all assertion failures.
224 *
225 * Reset list of all assertions triggered.
226 *
227 * \sa SDL_GetAssertionReport
228 */
229 extern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void);
230
231 /* Ends C function definitions when using C++ */
232 #ifdef __cplusplus
233 /* *INDENT-OFF* */
234 }
235 /* *INDENT-ON* */
236 #endif
237 #include "close_code.h"
238
239 #endif /* _SDL_assert_h */
240
241 /* vi: set ts=4 sw=4 expandtab: */