From 3b558eebee54fa4bc9d1a7bb428d4bd33e1b817e Mon Sep 17 00:00:00 2001 From: Daniel Lim Wee Soong Date: Thu, 22 Mar 2018 18:21:29 +0800 Subject: Logging: Create logging macros based on fmtlib Add a new set of logging macros based on fmtlib Similar but not exactly the same as https://github.com/citra-emu/citra/pull/3533 Citra currently uses a different version of fmt, which does not support FMT_VARIADIC so make_args is used instead. On the other hand, yuzu uses fmt 4.1.0 which doesn't have make_args yet so FMT_VARIADIC is used. --- src/common/logging/text_formatter.cpp | 41 +++++++++-------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) (limited to 'src/common/logging/text_formatter.cpp') diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp index e7e46c76b..8583916a8 100644 --- a/src/common/logging/text_formatter.cpp +++ b/src/common/logging/text_formatter.cpp @@ -18,50 +18,29 @@ namespace Log { -// TODO(bunnei): This should be moved to a generic path manipulation library -const char* TrimSourcePath(const char* path, const char* root) { - const char* p = path; - - while (*p != '\0') { - const char* next_slash = p; - while (*next_slash != '\0' && *next_slash != '/' && *next_slash != '\\') { - ++next_slash; - } - - bool is_src = Common::ComparePartialString(p, next_slash, root); - p = next_slash; - - if (*p != '\0') { - ++p; - } - if (is_src) { - path = p; - } - } - return path; -} - -void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len) { +std::string FormatLogMessage(const Entry& entry) { unsigned int time_seconds = static_cast(entry.timestamp.count() / 1000000); unsigned int time_fractional = static_cast(entry.timestamp.count() % 1000000); const char* class_name = GetLogClassName(entry.log_class); const char* level_name = GetLevelName(entry.log_level); - snprintf(out_text, text_len, "[%4u.%06u] %s <%s> %s: %s", time_seconds, time_fractional, - class_name, level_name, TrimSourcePath(entry.location.c_str()), entry.message.c_str()); + return fmt::format("[{:4d}.{:06d}] {} <{}> {}:{}:{}: {}", time_seconds, time_fractional, + class_name, level_name, entry.filename, entry.function, entry.line_num, + entry.message); } void PrintMessage(const Entry& entry) { - std::array format_buffer; - FormatLogMessage(entry, format_buffer.data(), format_buffer.size()); - fputs(format_buffer.data(), stderr); - fputc('\n', stderr); + auto str = FormatLogMessage(entry) + '\n'; + fputs(str.c_str(), stderr); } void PrintColoredMessage(const Entry& entry) { #ifdef _WIN32 - static HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); + HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); + if (console_handle == INVALID_HANDLE_VALUE) { + return; + } CONSOLE_SCREEN_BUFFER_INFO original_info = {0}; GetConsoleScreenBufferInfo(console_handle, &original_info); -- cgit v1.2.3