aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/bfc/assert.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/bfc/assert.cpp')
-rw-r--r--Src/Wasabi/bfc/assert.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/Src/Wasabi/bfc/assert.cpp b/Src/Wasabi/bfc/assert.cpp
new file mode 100644
index 00000000..6fb2aed3
--- /dev/null
+++ b/Src/Wasabi/bfc/assert.cpp
@@ -0,0 +1,104 @@
+#include "precomp_wasabi_bfc.h"
+#ifdef WIN32
+#include <windows.h>
+#endif
+#ifdef __APPLE__
+#include <unistd.h>
+#endif
+
+#include "bfc_assert.h"
+
+#ifdef ASSERTS_ENABLED
+
+static int in_assert = 0;
+
+// we try to use wsprintf because it can make for a smaller .exe
+#ifdef WIN32
+#define ASSERT_SPRINTF wsprintfA
+#elif defined(LINUX)
+#define ASSERT_SPRINTF sprintf
+#elif defined(__APPLE__)
+#define ASSERT_SPRINTF sprintf
+#else
+#error port me!
+#endif
+
+#ifdef WIN32
+static int isDebuggerPresent() {
+ HINSTANCE kernel32 = LoadLibrary(L"kernel32.dll");
+ if (kernel32 == NULL) return 0;
+ BOOL (WINAPI *IsDebuggerPresent)() = NULL;
+ IsDebuggerPresent = (BOOL (WINAPI *)())GetProcAddress(kernel32, "IsDebuggerPresent");
+ if (IsDebuggerPresent == NULL) return 0;
+ int ret = (*IsDebuggerPresent)();
+ FreeLibrary(kernel32);
+ return ret;
+}
+#endif
+
+static void assert_kill()
+{
+#ifdef _WIN32
+#ifndef _WIN64
+ __asm { int 3 };
+#else
+ ExitProcess(0);
+#endif
+#endif
+}
+void _assert_handler(const char *reason, const char *file, int line) {
+ char msg[4096] = {0};
+ ASSERT_SPRINTF(msg, "Expression: %s\nFile: %s\nLine: %d\n", reason, file, line);
+
+#ifdef WIN32
+ OutputDebugStringA(msg);
+ if (in_assert)
+ {
+ assert_kill();
+ }
+ in_assert = 1;
+
+ ATOM a = AddAtom(L"BYPASS_DEACTIVATE_MGR"); // so we don't need to call api->appdeactivation_setbypass
+
+ if (isDebuggerPresent() || MessageBoxA(NULL, msg, "Assertion failed", MB_OKCANCEL|MB_TASKMODAL) == IDCANCEL) {
+ assert_kill();
+ } else
+ ExitProcess(0);
+ DeleteAtom(a);
+#elif defined(LINUX)
+ kill(getpid(), SIGSEGV );
+#elif defined(__APPLE__)
+ kill(getpid(), SIGSEGV );
+#else
+#error port me!
+#endif
+ in_assert = 0;
+}
+
+void _assert_handler_str(const char *string, const char *reason, const char *file, int line)
+{
+ char msg[4096] = {0};
+ ASSERT_SPRINTF(msg, "\"%s\"\nExpression: %s\nFile: %s\nLine: %d\n", string, reason ? reason : "", file, line);
+
+#ifdef WIN32
+ OutputDebugStringA(msg);
+ if (in_assert) assert_kill();
+ in_assert = 1;
+
+ ATOM a = AddAtom(L"BYPASS_DEACTIVATE_MGR");
+ if (isDebuggerPresent() || MessageBoxA(NULL, msg, "Assertion failed", MB_OKCANCEL|MB_TASKMODAL) == IDCANCEL) {
+ assert_kill();
+ } else
+ ExitProcess(0);
+ DeleteAtom(a);
+#elif defined(LINUX)
+ kill(getpid(), SIGSEGV );
+#elif defined(__APPLE__)
+ kill(getpid(), SIGSEGV );
+#else
+#error port me!
+#endif
+ in_assert = 0;
+}
+
+#endif