SDL  2.0
SDL_assert.c File Reference
#include "./SDL_internal.h"
#include "SDL.h"
#include "SDL_atomic.h"
#include "SDL_messagebox.h"
#include "SDL_video.h"
#include "SDL_assert.h"
#include "SDL_assert_c.h"
#include "video/SDL_sysvideo.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+ Include dependency graph for SDL_assert.c:

Go to the source code of this file.

Macros

#define ENDLINE   "\n"
 

Functions

static SDL_assert_state SDL_PromptAssertion (const SDL_assert_data *data, void *userdata)
 
static void debug_print (const char *fmt,...)
 
static void SDL_AddAssertionToReport (SDL_assert_data *data)
 
static void SDL_GenerateAssertionReport (void)
 
static void SDL_ExitProcess (int exitcode)
 
static void SDL_AbortAssertion (void)
 
SDL_assert_state SDL_ReportAssertion (SDL_assert_data *data, const char *func, const char *file, int line)
 
void SDL_AssertionsQuit (void)
 
void SDL_SetAssertionHandler (SDL_AssertionHandler handler, void *userdata)
 Set an application-defined assertion handler. More...
 
const SDL_assert_dataSDL_GetAssertionReport (void)
 Get a list of all assertion failures. More...
 
void SDL_ResetAssertionReport (void)
 Reset the list of all assertion failures. More...
 
SDL_AssertionHandler SDL_GetDefaultAssertionHandler (void)
 Get the default assertion handler. More...
 
SDL_AssertionHandler SDL_GetAssertionHandler (void **userdata)
 Get the current assertion handler. More...
 

Variables

static SDL_assert_datatriggered_assertions = NULL
 
static SDL_mutexassertion_mutex = NULL
 
static SDL_AssertionHandler assertion_handler = SDL_PromptAssertion
 
static voidassertion_userdata = NULL
 

Macro Definition Documentation

◆ ENDLINE

#define ENDLINE   "\n"

Function Documentation

◆ debug_print()

static void debug_print ( const char *  fmt,
  ... 
)
static

Definition at line 74 of file SDL_assert.c.

75 {
76  va_list ap;
77  va_start(ap, fmt);
79  va_end(ap);
80 }

References SDL_LOG_CATEGORY_ASSERT, SDL_LOG_PRIORITY_WARN, and SDL_LogMessageV.

Referenced by SDL_GenerateAssertionReport(), and SDL_PromptAssertion().

◆ SDL_AbortAssertion()

static void SDL_AbortAssertion ( void  )
static

Definition at line 147 of file SDL_assert.c.

148 {
149  SDL_Quit();
150  SDL_ExitProcess(42);
151 }

References SDL_ExitProcess(), and SDL_Quit.

Referenced by SDL_ReportAssertion().

◆ SDL_AddAssertionToReport()

static void SDL_AddAssertionToReport ( SDL_assert_data data)
static

Definition at line 83 of file SDL_assert.c.

84 {
85  /* (data) is always a static struct defined with the assert macros, so
86  we don't have to worry about copying or allocating them. */
87  data->trigger_count++;
88  if (data->trigger_count == 1) { /* not yet added? */
89  data->next = triggered_assertions;
91  }
92 }

References triggered_assertions.

Referenced by SDL_ReportAssertion().

◆ SDL_AssertionsQuit()

void SDL_AssertionsQuit ( void  )

Definition at line 397 of file SDL_assert.c.

398 {
400 #ifndef SDL_THREADS_DISABLED
401  if (assertion_mutex != NULL) {
404  }
405 #endif
406 }

References assertion_mutex, NULL, SDL_DestroyMutex, and SDL_GenerateAssertionReport().

Referenced by SDL_Quit().

◆ SDL_ExitProcess()

static void SDL_ExitProcess ( int  exitcode)
static

Definition at line 126 of file SDL_assert.c.

127 {
128 #ifdef __WIN32__
129  /* "if you do not know the state of all threads in your process, it is
130  better to call TerminateProcess than ExitProcess"
131  https://msdn.microsoft.com/en-us/library/windows/desktop/ms682658(v=vs.85).aspx */
132  TerminateProcess(GetCurrentProcess(), exitcode);
133 
134 #elif defined(__EMSCRIPTEN__)
135  emscripten_cancel_main_loop(); /* this should "kill" the app. */
136  emscripten_force_exit(exitcode); /* this should "kill" the app. */
137  exit(exitcode);
138 #else
139  _exit(exitcode);
140 #endif
141 }

Referenced by SDL_AbortAssertion(), and SDL_ReportAssertion().

◆ SDL_GenerateAssertionReport()

static void SDL_GenerateAssertionReport ( void  )
static

Definition at line 95 of file SDL_assert.c.

96 {
98 
99  /* only do this if the app hasn't assigned an assertion handler. */
100  if ((item != NULL) && (assertion_handler != SDL_PromptAssertion)) {
101  debug_print("\n\nSDL assertion report.\n");
102  debug_print("All SDL assertions between last init/quit:\n\n");
103 
104  while (item != NULL) {
105  debug_print(
106  "'%s'\n"
107  " * %s (%s:%d)\n"
108  " * triggered %u time%s.\n"
109  " * always ignore: %s.\n",
110  item->condition, item->function, item->filename,
111  item->linenum, item->trigger_count,
112  (item->trigger_count == 1) ? "" : "s",
113  item->always_ignore ? "yes" : "no");
114  item = item->next;
115  }
116  debug_print("\n");
117 
119  }
120 }

References assertion_handler, debug_print(), NULL, SDL_assert_data, SDL_PromptAssertion(), SDL_ResetAssertionReport(), and triggered_assertions.

Referenced by SDL_AssertionsQuit().

◆ SDL_GetAssertionHandler()

SDL_AssertionHandler SDL_GetAssertionHandler ( void **  puserdata)

Get the current assertion handler.

This returns the function pointer that is called when an assertion is triggered. This is either the value last passed to SDL_SetAssertionHandler(), or if no application-specified function is set, is equivalent to calling SDL_GetDefaultAssertionHandler().

Parameters
puserdataPointer to a void*, which will store the "userdata" pointer that was passed to SDL_SetAssertionHandler(). This value will always be NULL for the default handler. If you don't care about this data, it is safe to pass a NULL pointer to this function to ignore it.
Returns
The SDL_AssertionHandler that is called when an assert triggers.

Definition at line 443 of file SDL_assert.c.

444 {
445  if (userdata != NULL) {
446  *userdata = assertion_userdata;
447  }
448  return assertion_handler;
449 }

References assertion_handler, assertion_userdata, and NULL.

◆ SDL_GetAssertionReport()

const SDL_assert_data* SDL_GetAssertionReport ( void  )

Get a list of all assertion failures.

Get all assertions triggered since last call to SDL_ResetAssertionReport(), or the start of the program.

The proper way to examine this data looks something like this:

const SDL_AssertData *item = SDL_GetAssertionReport(); while (item) { printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n", item->condition, item->function, item->filename, item->linenum, item->trigger_count, item->always_ignore ? "yes" : "no"); item = item->next; }

Returns
List of all assertions.
See also
SDL_ResetAssertionReport

Definition at line 419 of file SDL_assert.c.

420 {
421  return triggered_assertions;
422 }

References triggered_assertions.

◆ SDL_GetDefaultAssertionHandler()

SDL_AssertionHandler SDL_GetDefaultAssertionHandler ( void  )

Get the default assertion handler.

This returns the function pointer that is called by default when an assertion is triggered. This is an internal function provided by SDL, that is used for assertions when SDL_SetAssertionHandler() hasn't been used to provide a different function.

Returns
The default SDL_AssertionHandler that is called when an assert triggers.

Definition at line 438 of file SDL_assert.c.

439 {
440  return SDL_PromptAssertion;
441 }

References SDL_PromptAssertion().

◆ SDL_PromptAssertion()

static SDL_assert_state SDL_PromptAssertion ( const SDL_assert_data data,
void userdata 
)
static

Definition at line 155 of file SDL_assert.c.

156 {
157 #ifdef __WIN32__
158  #define ENDLINE "\r\n"
159 #else
160  #define ENDLINE "\n"
161 #endif
162 
163  const char *envr;
166  SDL_MessageBoxData messagebox;
167  SDL_MessageBoxButtonData buttons[] = {
168  { 0, SDL_ASSERTION_RETRY, "Retry" },
169  { 0, SDL_ASSERTION_BREAK, "Break" },
170  { 0, SDL_ASSERTION_ABORT, "Abort" },
172  SDL_ASSERTION_IGNORE, "Ignore" },
174  SDL_ASSERTION_ALWAYS_IGNORE, "Always Ignore" }
175  };
176  char *message;
177  int selected;
178 
179  (void) userdata; /* unused in default handler. */
180 
182  if (!message) {
183  /* Uh oh, we're in real trouble now... */
184  return SDL_ASSERTION_ABORT;
185  }
187  "Assertion failure at %s (%s:%d), triggered %u %s:" ENDLINE
188  " '%s'",
189  data->function, data->filename, data->linenum,
190  data->trigger_count, (data->trigger_count == 1) ? "time" : "times",
191  data->condition);
192 
193  debug_print("\n\n%s\n\n", message);
194 
195  /* let env. variable override, so unit tests won't block in a GUI. */
196  envr = SDL_getenv("SDL_ASSERT");
197  if (envr != NULL) {
199 
200  if (SDL_strcmp(envr, "abort") == 0) {
201  return SDL_ASSERTION_ABORT;
202  } else if (SDL_strcmp(envr, "break") == 0) {
203  return SDL_ASSERTION_BREAK;
204  } else if (SDL_strcmp(envr, "retry") == 0) {
205  return SDL_ASSERTION_RETRY;
206  } else if (SDL_strcmp(envr, "ignore") == 0) {
207  return SDL_ASSERTION_IGNORE;
208  } else if (SDL_strcmp(envr, "always_ignore") == 0) {
210  } else {
211  return SDL_ASSERTION_ABORT; /* oh well. */
212  }
213  }
214 
215  /* Leave fullscreen mode, if possible (scary!) */
217  if (window) {
220  } else {
221  /* !!! FIXME: ungrab the input if we're not fullscreen? */
222  /* No need to mess with the window */
223  window = NULL;
224  }
225  }
226 
227  /* Show a messagebox if we can, otherwise fall back to stdio */
228  SDL_zero(messagebox);
229  messagebox.flags = SDL_MESSAGEBOX_WARNING;
230  messagebox.window = window;
231  messagebox.title = "Assertion Failed";
232  messagebox.message = message;
233  messagebox.numbuttons = SDL_arraysize(buttons);
234  messagebox.buttons = buttons;
235 
236  if (SDL_ShowMessageBox(&messagebox, &selected) == 0) {
237  if (selected == -1) {
239  } else {
240  state = (SDL_assert_state)selected;
241  }
242  }
243 
244  else
245  {
246 #if defined(__EMSCRIPTEN__)
247  /* This is nasty, but we can't block on a custom UI. */
248  for ( ; ; ) {
249  SDL_bool okay = SDL_TRUE;
250  char *buf = (char *) EM_ASM_INT({
251  var str =
252  Pointer_stringify($0) + '\n\n' +
253  'Abort/Retry/Ignore/AlwaysIgnore? [ariA] :';
254  var reply = window.prompt(str, "i");
255  if (reply === null) {
256  reply = "i";
257  }
258  return allocate(intArrayFromString(reply), 'i8', ALLOC_NORMAL);
259  }, message);
260 
261  if (SDL_strcmp(buf, "a") == 0) {
263  /* (currently) no break functionality on Emscripten
264  } else if (SDL_strcmp(buf, "b") == 0) {
265  state = SDL_ASSERTION_BREAK; */
266  } else if (SDL_strcmp(buf, "r") == 0) {
268  } else if (SDL_strcmp(buf, "i") == 0) {
270  } else if (SDL_strcmp(buf, "A") == 0) {
272  } else {
273  okay = SDL_FALSE;
274  }
275  free(buf);
276 
277  if (okay) {
278  break;
279  }
280  }
281 #elif defined(HAVE_STDIO_H)
282  /* this is a little hacky. */
283  for ( ; ; ) {
284  char buf[32];
285  fprintf(stderr, "Abort/Break/Retry/Ignore/AlwaysIgnore? [abriA] : ");
286  fflush(stderr);
287  if (fgets(buf, sizeof (buf), stdin) == NULL) {
288  break;
289  }
290 
291  if (SDL_strncmp(buf, "a", 1) == 0) {
293  break;
294  } else if (SDL_strncmp(buf, "b", 1) == 0) {
296  break;
297  } else if (SDL_strncmp(buf, "r", 1) == 0) {
299  break;
300  } else if (SDL_strncmp(buf, "i", 1) == 0) {
302  break;
303  } else if (SDL_strncmp(buf, "A", 1) == 0) {
305  break;
306  }
307  }
308 #endif /* HAVE_STDIO_H */
309  }
310 
311  /* Re-enter fullscreen mode */
312  if (window) {
314  }
315 
317 
318  return state;
319 }

References SDL_MessageBoxData::buttons, debug_print(), ENDLINE, SDL_MessageBoxData::flags, free, SDL_MessageBoxData::message, NULL, SDL_MessageBoxData::numbuttons, SDL_arraysize, SDL_assert_state, SDL_ASSERTION_ABORT, SDL_ASSERTION_ALWAYS_IGNORE, SDL_ASSERTION_BREAK, SDL_ASSERTION_IGNORE, SDL_ASSERTION_RETRY, SDL_FALSE, SDL_getenv, SDL_GetFocusWindow(), SDL_GetWindowFlags, SDL_MAX_LOG_MESSAGE, SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, SDL_MESSAGEBOX_WARNING, SDL_MinimizeWindow, SDL_RestoreWindow, SDL_ShowMessageBox, SDL_snprintf, SDL_stack_alloc, SDL_stack_free, SDL_strcmp, SDL_strncmp, SDL_TRUE, SDL_WINDOW_FULLSCREEN, SDL_zero, state, SDL_MessageBoxData::title, void, and SDL_MessageBoxData::window.

Referenced by SDL_GenerateAssertionReport(), SDL_GetDefaultAssertionHandler(), and SDL_SetAssertionHandler().

◆ SDL_ReportAssertion()

SDL_assert_state SDL_ReportAssertion ( SDL_assert_data data,
const char *  func,
const char *  file,
int  line 
)

Definition at line 323 of file SDL_assert.c.

325 {
327  static int assertion_running = 0;
328 
329 #ifndef SDL_THREADS_DISABLED
330  static SDL_SpinLock spinlock = 0;
331  SDL_AtomicLock(&spinlock);
332  if (assertion_mutex == NULL) { /* never called SDL_Init()? */
334  if (assertion_mutex == NULL) {
335  SDL_AtomicUnlock(&spinlock);
336  return SDL_ASSERTION_IGNORE; /* oh well, I guess. */
337  }
338  }
339  SDL_AtomicUnlock(&spinlock);
340 
341  if (SDL_LockMutex(assertion_mutex) < 0) {
342  return SDL_ASSERTION_IGNORE; /* oh well, I guess. */
343  }
344 #endif
345 
346  /* doing this because Visual C is upset over assigning in the macro. */
347  if (data->trigger_count == 0) {
348  data->function = func;
349  data->filename = file;
350  data->linenum = line;
351  }
352 
354 
355  assertion_running++;
356  if (assertion_running > 1) { /* assert during assert! Abort. */
357  if (assertion_running == 2) {
359  } else if (assertion_running == 3) { /* Abort asserted! */
360  SDL_ExitProcess(42);
361  } else {
362  while (1) { /* do nothing but spin; what else can you do?! */ }
363  }
364  }
365 
366  if (!data->always_ignore) {
368  }
369 
370  switch (state)
371  {
372  case SDL_ASSERTION_ABORT:
374  return SDL_ASSERTION_IGNORE; /* shouldn't return, but oh well. */
375 
378  data->always_ignore = 1;
379  break;
380 
382  case SDL_ASSERTION_RETRY:
383  case SDL_ASSERTION_BREAK:
384  break; /* macro handles these. */
385  }
386 
387  assertion_running--;
388 
389 #ifndef SDL_THREADS_DISABLED
391 #endif
392 
393  return state;
394 }

References assertion_handler, assertion_mutex, assertion_userdata, NULL, SDL_AbortAssertion(), SDL_AddAssertionToReport(), SDL_assert_state, SDL_ASSERTION_ABORT, SDL_ASSERTION_ALWAYS_IGNORE, SDL_ASSERTION_BREAK, SDL_ASSERTION_IGNORE, SDL_ASSERTION_RETRY, SDL_AtomicLock, SDL_AtomicUnlock, SDL_CreateMutex, SDL_ExitProcess(), SDL_LockMutex, SDL_UnlockMutex, and state.

◆ SDL_ResetAssertionReport()

void SDL_ResetAssertionReport ( void  )

Reset the list of all assertion failures.

Reset list of all assertions triggered.

See also
SDL_GetAssertionReport

Definition at line 424 of file SDL_assert.c.

425 {
426  SDL_assert_data *next = NULL;
427  SDL_assert_data *item;
428  for (item = triggered_assertions; item != NULL; item = next) {
429  next = (SDL_assert_data *) item->next;
430  item->always_ignore = SDL_FALSE;
431  item->trigger_count = 0;
432  item->next = NULL;
433  }
434 
436 }

References NULL, SDL_assert_data, SDL_FALSE, and triggered_assertions.

Referenced by SDL_GenerateAssertionReport().

◆ SDL_SetAssertionHandler()

void SDL_SetAssertionHandler ( SDL_AssertionHandler  handler,
void userdata 
)

Set an application-defined assertion handler.

This allows an app to show its own assertion UI and/or force the response to an assertion failure. If the app doesn't provide this, SDL will try to do the right thing, popping up a system-specific GUI dialog, and probably minimizing any fullscreen windows.

This callback may fire from any thread, but it runs wrapped in a mutex, so it will only fire from one thread at a time.

Setting the callback to NULL restores SDL's original internal handler.

This callback is NOT reset to SDL's internal handler upon SDL_Quit()!

Return SDL_AssertState value of how to handle the assertion failure.

Parameters
handlerCallback function, called when an assertion fails.
userdataA pointer passed to the callback as-is.

Definition at line 408 of file SDL_assert.c.

409 {
410  if (handler != NULL) {
411  assertion_handler = handler;
412  assertion_userdata = userdata;
413  } else {
416  }
417 }

References assertion_handler, assertion_userdata, NULL, and SDL_PromptAssertion().

Variable Documentation

◆ assertion_handler

◆ assertion_mutex

SDL_mutex* assertion_mutex = NULL
static

Definition at line 62 of file SDL_assert.c.

Referenced by SDL_AssertionsQuit(), and SDL_ReportAssertion().

◆ assertion_userdata

void* assertion_userdata = NULL
static

◆ triggered_assertions

SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
SDL_LogMessageV
#define SDL_LogMessageV
Definition: SDL_dynapi_overrides.h:239
SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT
@ SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT
Definition: SDL_messagebox.h:50
SDL_ASSERTION_IGNORE
@ SDL_ASSERTION_IGNORE
Definition: SDL_assert.h:107
debug_print
static void debug_print(const char *fmt,...)
Definition: SDL_assert.c:74
assertion_userdata
static void * assertion_userdata
Definition: SDL_assert.c:66
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
NULL
#define NULL
Definition: begin_code.h:164
message
GLuint GLsizei const GLchar * message
Definition: SDL_opengl_glext.h:2483
SDL_MessageBoxData::title
const char * title
Definition: SDL_messagebox.h:96
SDL_ASSERTION_BREAK
@ SDL_ASSERTION_BREAK
Definition: SDL_assert.h:105
SDL_AtomicLock
#define SDL_AtomicLock
Definition: SDL_dynapi_overrides.h:64
assertion_mutex
static SDL_mutex * assertion_mutex
Definition: SDL_assert.c:62
SDL_GetWindowFlags
#define SDL_GetWindowFlags
Definition: SDL_dynapi_overrides.h:518
SDL_LOG_CATEGORY_ASSERT
@ SDL_LOG_CATEGORY_ASSERT
Definition: SDL_log.h:68
SDL_WINDOW_FULLSCREEN
@ SDL_WINDOW_FULLSCREEN
Definition: SDL_video.h:100
SDL_assert_state
#define SDL_assert_state
Definition: SDL_assert.h:279
SDL_assert_data
#define SDL_assert_data
Definition: SDL_assert.h:280
SDL_AddAssertionToReport
static void SDL_AddAssertionToReport(SDL_assert_data *data)
Definition: SDL_assert.c:83
SDL_CreateMutex
#define SDL_CreateMutex
Definition: SDL_dynapi_overrides.h:259
SDL_MESSAGEBOX_WARNING
@ SDL_MESSAGEBOX_WARNING
Definition: SDL_messagebox.h:40
SDL_MessageBoxData::message
const char * message
Definition: SDL_messagebox.h:97
SDL_GenerateAssertionReport
static void SDL_GenerateAssertionReport(void)
Definition: SDL_assert.c:95
SDL_strncmp
#define SDL_strncmp
Definition: SDL_dynapi_overrides.h:418
SDL_LOG_PRIORITY_WARN
@ SDL_LOG_PRIORITY_WARN
Definition: SDL_log.h:107
func
GLenum func
Definition: SDL_opengl_glext.h:657
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:74
SDL_stack_alloc
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
SDL_ResetAssertionReport
void SDL_ResetAssertionReport(void)
Reset the list of all assertion failures.
Definition: SDL_assert.c:424
SDL_GetFocusWindow
SDL_Window * SDL_GetFocusWindow(void)
Definition: SDL_video.c:2671
SDL_MinimizeWindow
#define SDL_MinimizeWindow
Definition: SDL_dynapi_overrides.h:537
SDL_PromptAssertion
static SDL_assert_state SDL_PromptAssertion(const SDL_assert_data *data, void *userdata)
Definition: SDL_assert.c:155
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: SDL_opengl_glext.h:2480
SDL_AbortAssertion
static void SDL_AbortAssertion(void)
Definition: SDL_assert.c:147
SDL_AtomicUnlock
#define SDL_AtomicUnlock
Definition: SDL_dynapi_overrides.h:65
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_MessageBoxData::flags
Uint32 flags
Definition: SDL_messagebox.h:94
SDL_MessageBoxData
MessageBox structure containing title, text, window, etc.
Definition: SDL_messagebox.h:93
SDL_MessageBoxData::window
SDL_Window * window
Definition: SDL_messagebox.h:95
SDL_Quit
#define SDL_Quit
Definition: SDL_dynapi_overrides.h:58
SDL_MessageBoxButtonData
Individual button data.
Definition: SDL_messagebox.h:57
SDL_ExitProcess
static void SDL_ExitProcess(int exitcode)
Definition: SDL_assert.c:126
SDL_TRUE
@ SDL_TRUE
Definition: SDL_stdinc.h:164
SDL_RestoreWindow
#define SDL_RestoreWindow
Definition: SDL_dynapi_overrides.h:538
SDL_ASSERTION_ALWAYS_IGNORE
@ SDL_ASSERTION_ALWAYS_IGNORE
Definition: SDL_assert.h:108
SDL_SpinLock
int SDL_SpinLock
Definition: SDL_atomic.h:89
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
SDL_MessageBoxData::buttons
const SDL_MessageBoxButtonData * buttons
Definition: SDL_messagebox.h:100
SDL_getenv
#define SDL_getenv
Definition: SDL_dynapi_overrides.h:378
ENDLINE
#define ENDLINE
SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT
@ SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT
Definition: SDL_messagebox.h:49
SDL_stack_free
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355
SDL_ShowMessageBox
#define SDL_ShowMessageBox
Definition: SDL_dynapi_overrides.h:243
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40
SDL_ASSERTION_ABORT
@ SDL_ASSERTION_ABORT
Definition: SDL_assert.h:106
SDL_DestroyMutex
#define SDL_DestroyMutex
Definition: SDL_dynapi_overrides.h:263
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:162
SDL_FALSE
@ SDL_FALSE
Definition: SDL_stdinc.h:163
SDL_strcmp
#define SDL_strcmp
Definition: SDL_dynapi_overrides.h:417
void
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
Definition: SDL_dynapi_procs.h:89
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
free
SDL_EventEntry * free
Definition: SDL_events.c:84
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
SDL_MAX_LOG_MESSAGE
#define SDL_MAX_LOG_MESSAGE
The maximum size of a log message.
Definition: SDL_log.h:54
assertion_handler
static SDL_AssertionHandler assertion_handler
Definition: SDL_assert.c:65
SDL_MessageBoxData::numbuttons
int numbuttons
Definition: SDL_messagebox.h:99
SDL_ASSERTION_RETRY
@ SDL_ASSERTION_RETRY
Definition: SDL_assert.h:104
triggered_assertions
static SDL_assert_data * triggered_assertions
Definition: SDL_assert.c:59