Skip to content

Commit b2d1260

Browse files
author
Christophe Riccio
committed
Added SDL library
1 parent 30f8ee5 commit b2d1260

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+18924
-3677
lines changed

source/lib/sdl/include/SDL_assert.h

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
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+
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: */

0 commit comments

Comments
 (0)