#include "assert.hh" #include "exception.hh" #include "debug.hh" #if defined(__CYGWIN__) #include #endif #include #include #include namespace Kakoune { struct assert_failed : logic_error { assert_failed(String message) : m_message(std::move(message)) {} const char* what() const override { return m_message.c_str(); } private: String m_message; }; void on_assert_failed(const char* message) { String debug_info = "pid: " + to_string(getpid()); write_debug("assert failed: '"_str + message + "' " + debug_info); const auto msg = message + "\n[Debug Infos]\n"_str + debug_info; #if defined(__CYGWIN__) int res = MessageBox(NULL, msg.c_str(), "Kakoune: assert failed", MB_OKCANCEL | MB_ICONERROR); switch (res) { case IDCANCEL: throw assert_failed(message); case IDOK: return; } #else auto cmd = "xmessage -buttons 'quit:0,ignore:1' '" + msg + "'"; switch (system(cmd.c_str())) { case -1: case 0: throw assert_failed(message); case 1: return; } #endif } }