summaryrefslogtreecommitdiffhomepage
path: root/compat/assert.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compat/assert.cpp')
-rw-r--r--compat/assert.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/compat/assert.cpp b/compat/assert.cpp
new file mode 100644
index 00000000..279a08c0
--- /dev/null
+++ b/compat/assert.cpp
@@ -0,0 +1,80 @@
+#include "assert.hpp"
+#include <cstdlib>
+#include <cstdio>
+#include <cstdarg>
+
+#ifdef __GNUG__
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#endif
+
+namespace floormat {
+
+namespace {
+
+template<bool DoPrefix, bool DoSourceLocation>
+CORRADE_NEVER_INLINE
+void fm_emit_debug_(const char* prefix, const char* file, int line, const char* fmt, va_list arg_ptr)
+{
+ std::fflush(stdout);
+ std::fflush(stderr);
+ if constexpr(DoPrefix)
+ std::fputs(prefix, stderr);
+ std::vfprintf(stderr, fmt, arg_ptr);
+ if constexpr(DoSourceLocation)
+ std::fprintf(stderr, " in %s:%d", file, line);
+ std::fputc('\n', stderr);
+ std::fflush(stderr);
+}
+
+} // namespace
+
+void fm_emit_debug(const char* prefix, fm_FORMAT_ARG_MSVC const char* fmt, ...)
+{
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ fm_emit_debug_<true, false>(prefix, nullptr, 0, fmt, arg_ptr);
+ va_end(arg_ptr);
+}
+
+void fm_emit_debug0(fm_FORMAT_ARG_MSVC const char* fmt, ...)
+{
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ fm_emit_debug_<false, false>(nullptr, nullptr, 0, fmt, arg_ptr);
+ va_end(arg_ptr);
+}
+
+void CORRADE_NEVER_INLINE fm_emit_debug_loc(const char* prefix, const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...)
+{
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ fm_emit_debug_<true, true>(prefix, file, line, fmt, arg_ptr);
+ va_end(arg_ptr);
+}
+
+void fm_emit_assert_fail(const char* expr, const char* file, int line)
+{
+ std::fflush(stdout);
+ std::fflush(stderr);
+ std::fprintf(stderr, "assertion failed: %s in %s:%d", expr, file, line);
+ std::fflush(stderr);
+ std::abort();
+}
+
+void fm_emit_abort(const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...)
+{
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ fm_emit_debug_<true, true>("fatal: ", file, line, fmt, arg_ptr);
+ va_end(arg_ptr);
+ std::abort();
+}
+
+void fm_emit_abort()
+{
+ std::fflush(stdout);
+ std::fflush(stderr);
+ std::abort();
+}
+
+} // namespace floormat