Mercurial > sdl-ios-xcode
annotate src/SDL_assert.c @ 3670:62b6a5b99918
Clean up assertion API for public use.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Wed, 13 Jan 2010 19:29:33 +0000 |
parents | 46d27a9571fa |
children | 0d6f520c0eb9 |
rev | line source |
---|---|
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
1 /* |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
2 SDL - Simple DirectMedia Layer |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
3 Copyright (C) 1997-2009 Sam Lantinga |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
4 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
5 This library is free software; you can redistribute it and/or |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
7 License as published by the Free Software Foundation; either |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
9 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
10 This library is distributed in the hope that it will be useful, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
13 Lesser General Public License for more details. |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
14 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
18 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
19 Sam Lantinga |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
20 slouken@libsdl.org |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
21 */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
22 |
3651 | 23 #include "SDL.h" |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
24 #include "SDL_assert.h" |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
25 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
26 #ifdef _WINDOWS |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
27 #define WIN32_LEAN_AND_MEAN 1 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
28 #include <windows.h> |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
29 #else /* fprintf, _exit(), etc. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
30 #include <stdio.h> |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
31 #include <stdlib.h> |
3648
a9d830c05998
Fixed build problems with gcc __attribute__.
Ryan C. Gordon <icculus@icculus.org>
parents:
3647
diff
changeset
|
32 #include <unistd.h> |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
33 #endif |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
34 |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
35 static SDL_assert_state |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
36 SDL_PromptAssertion(const SDL_assert_data *data, void *userdata); |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
37 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
38 /* |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
39 * We keep all triggered assertions in a singly-linked list so we can |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
40 * generate a report later. |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
41 */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
42 static SDL_assert_data assertion_list_terminator = { 0, 0, 0, 0, 0, 0, 0 }; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
43 static SDL_assert_data *triggered_assertions = &assertion_list_terminator; |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
44 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
45 static SDL_mutex *assertion_mutex = NULL; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
46 static SDL_AssertionHandler assertion_handler = SDL_PromptAssertion; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
47 static void *assertion_userdata = NULL; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
48 |
3648
a9d830c05998
Fixed build problems with gcc __attribute__.
Ryan C. Gordon <icculus@icculus.org>
parents:
3647
diff
changeset
|
49 #ifdef __GNUC__ |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
50 static void |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
51 debug_print(const char *fmt, ...) __attribute__((format (printf, 1, 2))); |
3648
a9d830c05998
Fixed build problems with gcc __attribute__.
Ryan C. Gordon <icculus@icculus.org>
parents:
3647
diff
changeset
|
52 #endif |
a9d830c05998
Fixed build problems with gcc __attribute__.
Ryan C. Gordon <icculus@icculus.org>
parents:
3647
diff
changeset
|
53 |
a9d830c05998
Fixed build problems with gcc __attribute__.
Ryan C. Gordon <icculus@icculus.org>
parents:
3647
diff
changeset
|
54 static void |
a9d830c05998
Fixed build problems with gcc __attribute__.
Ryan C. Gordon <icculus@icculus.org>
parents:
3647
diff
changeset
|
55 debug_print(const char *fmt, ...) |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
56 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
57 #ifdef _WINDOWS |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
58 /* Format into a buffer for OutputDebugStringA(). */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
59 char buf[1024]; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
60 char *startptr; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
61 char *ptr; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
62 int len; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
63 va_list ap; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
64 va_start(ap, fmt); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
65 len = (int) SDL_vsnprintf(buf, sizeof (buf), fmt, ap); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
66 va_end(ap); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
67 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
68 /* Visual C's vsnprintf() may not null-terminate the buffer. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
69 if ((len >= sizeof (buf)) || (len < 0)) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
70 buf[sizeof (buf) - 1] = '\0'; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
71 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
72 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
73 /* Write it, sorting out the Unix newlines... */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
74 startptr = buf; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
75 for (ptr = startptr; *ptr; ptr++) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
76 if (*ptr == '\n') { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
77 *ptr = '\0'; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
78 OutputDebugStringA(startptr); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
79 OutputDebugStringA("\r\n"); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
80 startptr = ptr+1; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
81 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
82 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
83 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
84 /* catch that last piece if it didn't have a newline... */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
85 if (startptr != ptr) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
86 OutputDebugStringA(startptr); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
87 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
88 #else |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
89 /* Unix has it easy. Just dump it to stderr. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
90 va_list ap; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
91 va_start(ap, fmt); |
3669
46d27a9571fa
Whoops, that should be vfprintf(), not fprintf(). :)
Ryan C. Gordon <icculus@icculus.org>
parents:
3664
diff
changeset
|
92 vfprintf(stderr, fmt, ap); |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
93 va_end(ap); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
94 fflush(stderr); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
95 #endif |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
96 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
97 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
98 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
99 #ifdef _WINDOWS |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
100 static SDL_assert_state SDL_Windows_AssertChoice = SDL_ASSERTION_ABORT; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
101 static const SDL_assert_data *SDL_Windows_AssertData = NULL; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
102 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
103 static LRESULT CALLBACK |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
104 SDL_Assertion_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
105 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
106 switch (msg) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
107 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
108 case WM_CREATE: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
109 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
110 /* !!! FIXME: all this code stinks. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
111 const SDL_assert_data *data = SDL_Windows_AssertData; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
112 char buf[1024]; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
113 const int w = 100; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
114 const int h = 25; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
115 const int gap = 10; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
116 int x = gap; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
117 int y = 50; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
118 int len; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
119 int i; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
120 static const struct { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
121 const char *name; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
122 SDL_assert_state state; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
123 } buttons[] = { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
124 {"Abort", SDL_ASSERTION_ABORT }, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
125 {"Break", SDL_ASSERTION_BREAK }, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
126 {"Retry", SDL_ASSERTION_RETRY }, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
127 {"Ignore", SDL_ASSERTION_IGNORE }, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
128 {"Always Ignore", SDL_ASSERTION_ALWAYS_IGNORE }, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
129 }; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
130 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
131 len = (int) SDL_snprintf(buf, sizeof (buf), |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
132 "Assertion failure at %s (%s:%d), triggered %u time%s:\r\n '%s'", |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
133 data->function, data->filename, data->linenum, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
134 data->trigger_count, (data->trigger_count == 1) ? "" : "s", |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
135 data->condition); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
136 if ((len < 0) || (len >= sizeof (buf))) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
137 buf[sizeof (buf) - 1] = '\0'; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
138 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
139 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
140 CreateWindowA("STATIC", buf, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
141 WS_VISIBLE | WS_CHILD | SS_LEFT, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
142 x, y, 550, 100, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
143 hwnd, (HMENU) 1, NULL, NULL); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
144 y += 110; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
145 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
146 for (i = 0; i < (sizeof (buttons) / sizeof (buttons[0])); i++) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
147 CreateWindowA("BUTTON", buttons[i].name, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
148 WS_VISIBLE | WS_CHILD, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
149 x, y, w, h, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
150 hwnd, (HMENU) buttons[i].state, NULL, NULL); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
151 x += w + gap; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
152 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
153 break; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
154 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
155 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
156 case WM_COMMAND: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
157 SDL_Windows_AssertChoice = ((SDL_assert_state) (LOWORD(wParam))); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
158 SDL_Windows_AssertData = NULL; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
159 break; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
160 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
161 case WM_DESTROY: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
162 SDL_Windows_AssertData = NULL; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
163 break; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
164 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
165 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
166 return DefWindowProc(hwnd, msg, wParam, lParam); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
167 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
168 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
169 static SDL_assert_state |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
170 SDL_PromptAssertion_windows(const SDL_assert_data *data) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
171 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
172 HINSTANCE hInstance = 0; /* !!! FIXME? */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
173 HWND hwnd; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
174 MSG msg; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
175 WNDCLASS wc = {0}; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
176 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
177 SDL_Windows_AssertChoice = SDL_ASSERTION_ABORT; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
178 SDL_Windows_AssertData = data; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
179 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
180 wc.lpszClassName = TEXT("SDL_assert"); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
181 wc.hInstance = hInstance ; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
182 wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
183 wc.lpfnWndProc = SDL_Assertion_WndProc; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
184 wc.hCursor = LoadCursor(0, IDC_ARROW); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
185 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
186 RegisterClass(&wc); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
187 hwnd = CreateWindow(wc.lpszClassName, TEXT("SDL assertion failure"), |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
188 WS_OVERLAPPEDWINDOW | WS_VISIBLE, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
189 150, 150, 570, 260, 0, 0, hInstance, 0); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
190 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
191 while (GetMessage(&msg, NULL, 0, 0) && (SDL_Windows_AssertData != NULL)) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
192 TranslateMessage(&msg); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
193 DispatchMessage(&msg); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
194 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
195 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
196 DestroyWindow(hwnd); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
197 UnregisterClass(wc.lpszClassName, hInstance); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
198 return SDL_Windows_AssertChoice; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
199 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
200 #endif |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
201 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
202 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
203 static void SDL_AddAssertionToReport(SDL_assert_data *data) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
204 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
205 /* (data) is always a static struct defined with the assert macros, so |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
206 we don't have to worry about copying or allocating them. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
207 if (data->next == NULL) { /* not yet added? */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
208 data->next = triggered_assertions; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
209 triggered_assertions = data; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
210 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
211 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
212 |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
213 |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
214 static void SDL_GenerateAssertionReport(void) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
215 { |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
216 const SDL_assert_data *item; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
217 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
218 /* only do this if the app hasn't assigned an assertion handler. */ |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
219 if (assertion_handler != SDL_PromptAssertion) |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
220 return; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
221 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
222 item = SDL_GetAssertionReport(); |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
223 if (item->condition) |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
224 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
225 debug_print("\n\nSDL assertion report.\n"); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
226 debug_print("All SDL assertions between last init/quit:\n\n"); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
227 |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
228 while (item->condition) { |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
229 debug_print( |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
230 "'%s'\n" |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
231 " * %s (%s:%d)\n" |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
232 " * triggered %u time%s.\n" |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
233 " * always ignore: %s.\n", |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
234 item->condition, item->function, item->filename, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
235 item->linenum, item->trigger_count, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
236 (item->trigger_count == 1) ? "" : "s", |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
237 item->always_ignore ? "yes" : "no"); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
238 item = item->next; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
239 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
240 debug_print("\n"); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
241 |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
242 SDL_ResetAssertionReport(); |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
243 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
244 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
245 |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
246 static void SDL_ExitProcess(int exitcode) |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
247 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
248 #ifdef _WINDOWS |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
249 ExitProcess(42); |
3656
f17ea6f49745
Assume _exit() is available. It may be, even if unix isn't defined.
Sam Lantinga <slouken@libsdl.org>
parents:
3655
diff
changeset
|
250 #else |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
251 _exit(42); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
252 #endif |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
253 } |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
254 |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
255 static void SDL_AbortAssertion(void) |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
256 { |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
257 SDL_Quit(); |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
258 SDL_ExitProcess(42); |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
259 } |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
260 |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
261 |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
262 static SDL_assert_state |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
263 SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
264 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
265 const char *envr; |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
266 SDL_assert_state state = SDL_ASSERTION_ABORT; |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
267 SDL_WindowID window; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
268 |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
269 (void) userdata; /* unused in default handler. */ |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
270 |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
271 debug_print("\n\n" |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
272 "Assertion failure at %s (%s:%d), triggered %u time%s:\n" |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
273 " '%s'\n" |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
274 "\n", |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
275 data->function, data->filename, data->linenum, |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
276 data->trigger_count, (data->trigger_count == 1) ? "" : "s", |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
277 data->condition); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
278 |
3655
1cc7f0143c12
Moved SDL_FUNCTION out so it's always available, and added SDL_FILE and SDL_LINE
Sam Lantinga <slouken@libsdl.org>
parents:
3651
diff
changeset
|
279 /* let env. variable override, so unit tests won't block in a GUI. */ |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
280 envr = SDL_getenv("SDL_ASSERT"); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
281 if (envr != NULL) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
282 if (SDL_strcmp(envr, "abort") == 0) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
283 return SDL_ASSERTION_ABORT; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
284 } else if (SDL_strcmp(envr, "break") == 0) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
285 return SDL_ASSERTION_BREAK; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
286 } else if (SDL_strcmp(envr, "retry") == 0) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
287 return SDL_ASSERTION_RETRY; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
288 } else if (SDL_strcmp(envr, "ignore") == 0) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
289 return SDL_ASSERTION_IGNORE; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
290 } else if (SDL_strcmp(envr, "always_ignore") == 0) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
291 return SDL_ASSERTION_ALWAYS_IGNORE; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
292 } else { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
293 return SDL_ASSERTION_ABORT; /* oh well. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
294 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
295 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
296 |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
297 /* Leave fullscreen mode, if possible (scary!) */ |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
298 window = SDL_GetFocusWindow(); |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
299 if (window) { |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
300 if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) { |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
301 SDL_MinimizeWindow(window); |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
302 } else { |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
303 /* !!! FIXME: ungrab the input if we're not fullscreen? */ |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
304 /* No need to mess with the window */ |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
305 window = 0; |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
306 } |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
307 } |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
308 |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
309 /* platform-specific UI... */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
310 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
311 #ifdef _WINDOWS |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
312 state = SDL_PromptAssertion_windows(data); |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
313 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
314 #elif __APPLE__ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
315 /* This has to be done in an Objective-C (*.m) file, so we call out. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
316 extern SDL_assert_state SDL_PromptAssertion_cocoa(const SDL_assert_data *); |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
317 state = SDL_PromptAssertion_cocoa(data); |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
318 |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
319 #else |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
320 /* this is a little hacky. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
321 for ( ; ; ) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
322 char buf[32]; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
323 fprintf(stderr, "Abort/Break/Retry/Ignore/AlwaysIgnore? [abriA] : "); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
324 fflush(stderr); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
325 if (fgets(buf, sizeof (buf), stdin) == NULL) { |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
326 break; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
327 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
328 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
329 if (SDL_strcmp(buf, "a") == 0) { |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
330 state = SDL_ASSERTION_ABORT; |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
331 break; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
332 } else if (SDL_strcmp(envr, "b") == 0) { |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
333 state = SDL_ASSERTION_BREAK; |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
334 break; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
335 } else if (SDL_strcmp(envr, "r") == 0) { |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
336 state = SDL_ASSERTION_RETRY; |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
337 break; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
338 } else if (SDL_strcmp(envr, "i") == 0) { |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
339 state = SDL_ASSERTION_IGNORE; |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
340 break; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
341 } else if (SDL_strcmp(envr, "A") == 0) { |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
342 state = SDL_ASSERTION_ALWAYS_IGNORE; |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
343 break; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
344 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
345 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
346 #endif |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
347 |
3657
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
348 /* Re-enter fullscreen mode */ |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
349 if (window) { |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
350 SDL_RestoreWindow(window); |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
351 } |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
352 |
eaea59cee6f2
Leave fullscreen mode to pop an assertion dialog
Sam Lantinga <slouken@libsdl.org>
parents:
3656
diff
changeset
|
353 return state; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
354 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
355 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
356 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
357 SDL_assert_state |
3655
1cc7f0143c12
Moved SDL_FUNCTION out so it's always available, and added SDL_FILE and SDL_LINE
Sam Lantinga <slouken@libsdl.org>
parents:
3651
diff
changeset
|
358 SDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file, |
1cc7f0143c12
Moved SDL_FUNCTION out so it's always available, and added SDL_FILE and SDL_LINE
Sam Lantinga <slouken@libsdl.org>
parents:
3651
diff
changeset
|
359 int line) |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
360 { |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
361 static int assertion_running = 0; |
3662
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
362 static SDL_SpinLock spinlock = 0; |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
363 SDL_assert_state state = SDL_ASSERTION_IGNORE; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
364 |
3662
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
365 SDL_AtomicLock(&spinlock); |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
366 if (assertion_mutex == NULL) { /* never called SDL_Init()? */ |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
367 assertion_mutex = SDL_CreateMutex(); |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
368 if (assertion_mutex == NULL) { |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
369 SDL_AtomicUnlock(&spinlock); |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
370 return SDL_ASSERTION_IGNORE; /* oh well, I guess. */ |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
371 } |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
372 } |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
373 SDL_AtomicUnlock(&spinlock); |
6a0b3048f271
Handle assertion failures when SDL_Init() isn't called.
Ryan C. Gordon <icculus@icculus.org>
parents:
3661
diff
changeset
|
374 |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
375 if (SDL_LockMutex(assertion_mutex) < 0) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
376 return SDL_ASSERTION_IGNORE; /* oh well, I guess. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
377 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
378 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
379 /* doing this because Visual C is upset over assigning in the macro. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
380 if (data->trigger_count == 0) { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
381 data->function = func; |
3655
1cc7f0143c12
Moved SDL_FUNCTION out so it's always available, and added SDL_FILE and SDL_LINE
Sam Lantinga <slouken@libsdl.org>
parents:
3651
diff
changeset
|
382 data->filename = file; |
1cc7f0143c12
Moved SDL_FUNCTION out so it's always available, and added SDL_FILE and SDL_LINE
Sam Lantinga <slouken@libsdl.org>
parents:
3651
diff
changeset
|
383 data->linenum = line; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
384 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
385 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
386 SDL_AddAssertionToReport(data); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
387 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
388 data->trigger_count++; |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
389 |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
390 assertion_running++; |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
391 if (assertion_running > 1) { /* assert during assert! Abort. */ |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
392 if (assertion_running == 2) { |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
393 SDL_AbortAssertion(); |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
394 } else if (assertion_running == 3) { /* Abort asserted! */ |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
395 SDL_ExitProcess(42); |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
396 } else { |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
397 while (1) { /* do nothing but spin; what else can you do?! */ } |
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
398 } |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
399 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
400 |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
401 if (!data->always_ignore) { |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
402 state = assertion_handler(data, assertion_userdata); |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
403 } |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
404 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
405 switch (state) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
406 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
407 case SDL_ASSERTION_ABORT: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
408 SDL_AbortAssertion(); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
409 return SDL_ASSERTION_IGNORE; /* shouldn't return, but oh well. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
410 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
411 case SDL_ASSERTION_ALWAYS_IGNORE: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
412 state = SDL_ASSERTION_IGNORE; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
413 data->always_ignore = 1; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
414 break; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
415 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
416 case SDL_ASSERTION_IGNORE: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
417 case SDL_ASSERTION_RETRY: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
418 case SDL_ASSERTION_BREAK: |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
419 break; /* macro handles these. */ |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
420 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
421 |
3661
22b6a0c7ea6e
Handle assertion failures during assertion handler.
Ryan C. Gordon <icculus@icculus.org>
parents:
3657
diff
changeset
|
422 assertion_running--; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
423 SDL_UnlockMutex(assertion_mutex); |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
424 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
425 return state; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
426 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
427 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
428 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
429 int SDL_AssertionsInit(void) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
430 { |
3664
8bdc37b1a52a
Handle assert init/quit better.
Ryan C. Gordon <icculus@icculus.org>
parents:
3662
diff
changeset
|
431 /* this is a no-op at the moment. */ |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
432 return 0; |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
433 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
434 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
435 void SDL_AssertionsQuit(void) |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
436 { |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
437 SDL_GenerateAssertionReport(); |
3664
8bdc37b1a52a
Handle assert init/quit better.
Ryan C. Gordon <icculus@icculus.org>
parents:
3662
diff
changeset
|
438 if (assertion_mutex != NULL) { |
8bdc37b1a52a
Handle assert init/quit better.
Ryan C. Gordon <icculus@icculus.org>
parents:
3662
diff
changeset
|
439 SDL_DestroyMutex(assertion_mutex); |
8bdc37b1a52a
Handle assert init/quit better.
Ryan C. Gordon <icculus@icculus.org>
parents:
3662
diff
changeset
|
440 assertion_mutex = NULL; |
8bdc37b1a52a
Handle assert init/quit better.
Ryan C. Gordon <icculus@icculus.org>
parents:
3662
diff
changeset
|
441 } |
3670
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
442 } |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
443 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
444 void SDL_SetAssertionHandler(SDL_AssertionHandler handler, void *userdata) |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
445 { |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
446 if (handler != NULL) { |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
447 assertion_handler = handler; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
448 assertion_userdata = userdata; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
449 } else { |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
450 assertion_handler = SDL_PromptAssertion; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
451 assertion_userdata = NULL; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
452 } |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
453 } |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
454 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
455 const SDL_assert_data *SDL_GetAssertionReport(void) |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
456 { |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
457 return triggered_assertions; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
458 } |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
459 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
460 void SDL_ResetAssertionReport(void) |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
461 { |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
462 SDL_assert_data *item = triggered_assertions; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
463 SDL_assert_data *next = NULL; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
464 for (item = triggered_assertions; item->condition; item = next) { |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
465 next = (SDL_assert_data *) item->next; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
466 item->always_ignore = SDL_FALSE; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
467 item->trigger_count = 0; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
468 item->next = NULL; |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
469 } |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
470 |
62b6a5b99918
Clean up assertion API for public use.
Ryan C. Gordon <icculus@icculus.org>
parents:
3669
diff
changeset
|
471 triggered_assertions = &assertion_list_terminator; |
3647
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
472 } |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
473 |
c5925cd41955
First pass at Ryan's assertion code, minor tweaks to come.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
474 /* vi: set ts=4 sw=4 expandtab: */ |