diff --git a/Source/utils/log.hpp b/Source/utils/log.hpp index 4e6807204..b7afe38c2 100644 --- a/Source/utils/log.hpp +++ b/Source/utils/log.hpp @@ -10,6 +10,9 @@ namespace devilution { +// Local definition to fix compilation issue due to header conflict. +void app_fatal(const char *pszFmt, ...); + enum class LogCategory { Application = SDL_LOG_CATEGORY_APPLICATION, Error = SDL_LOG_CATEGORY_ERROR, @@ -25,25 +28,44 @@ enum class LogCategory { constexpr auto defaultCategory = LogCategory::Application; enum class LogPriority { - Verbose = SDL_LOG_PRIORITY_VERBOSE, - Debug = SDL_LOG_PRIORITY_DEBUG, - Info = SDL_LOG_PRIORITY_INFO, - Warn = SDL_LOG_PRIORITY_WARN, - Error = SDL_LOG_PRIORITY_ERROR, - Critical = SDL_LOG_PRIORITY_CRITICAL, + Verbose = SDL_LOG_PRIORITY_VERBOSE, + Debug = SDL_LOG_PRIORITY_DEBUG, + Info = SDL_LOG_PRIORITY_INFO, + Warn = SDL_LOG_PRIORITY_WARN, + Error = SDL_LOG_PRIORITY_ERROR, + Critical = SDL_LOG_PRIORITY_CRITICAL, }; +namespace detail { + +template +std::string format(const char *fmt, Args &&... args) +{ + FMT_TRY + { + return fmt::format(fmt, std::forward(args)...); + } + FMT_CATCH(const fmt::format_error &e) + { + auto error = fmt::format("Format error, fmt: {}, error: {}", fmt ? fmt : "nullptr", e.what()); + SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "%s", error.c_str()); + app_fatal("%s", error.c_str()); + } +} + +} // namespace detail + template void Log(const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_Log("%s", str.c_str()); } template void LogVerbose(LogCategory category, const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_LogVerbose(static_cast(category), "%s", str.c_str()); } @@ -56,7 +78,7 @@ void LogVerbose(const char *fmt, Args &&... args) template void LogDebug(LogCategory category, const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_LogDebug(static_cast(category), "%s", str.c_str()); } @@ -69,7 +91,7 @@ void LogDebug(const char *fmt, Args &&... args) template void LogInfo(LogCategory category, const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_LogInfo(static_cast(category), "%s", str.c_str()); } @@ -82,7 +104,7 @@ void LogInfo(const char *fmt, Args &&... args) template void LogWarn(LogCategory category, const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_LogWarn(static_cast(category), "%s", str.c_str()); } @@ -95,7 +117,7 @@ void LogWarn(const char *fmt, Args &&... args) template void LogError(LogCategory category, const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_LogError(static_cast(category), "%s", str.c_str()); } @@ -108,7 +130,7 @@ void LogError(const char *fmt, Args &&... args) template void LogCritical(LogCategory category, const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_LogCritical(static_cast(category), "%s", str.c_str()); } @@ -121,7 +143,7 @@ void LogCritical(const char *fmt, Args &&... args) template void LogMessageV(LogCategory category, LogPriority priority, const char *fmt, Args &&... args) { - auto str = fmt::format(fmt, std::forward(args)...); + auto str = detail::format(fmt, std::forward(args)...); SDL_LogMessageV(static_cast(category), static_cast(priority), "%s", str.c_str()); }