summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/logging/text_formatter.cpp27
-rw-r--r--src/common/logging/text_formatter.h12
-rw-r--r--src/common/string_util.h15
3 files changed, 53 insertions, 1 deletions
diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp
index b603ead13..88deb150e 100644
--- a/src/common/logging/text_formatter.cpp
+++ b/src/common/logging/text_formatter.cpp
@@ -14,8 +14,33 @@
14#include "common/logging/log.h" 14#include "common/logging/log.h"
15#include "common/logging/text_formatter.h" 15#include "common/logging/text_formatter.h"
16 16
17#include "common/string_util.h"
18
17namespace Log { 19namespace Log {
18 20
21// TODO(bunnei): This should be moved to a generic path manipulation library
22const char* TrimSourcePath(const char* path, const char* root) {
23 const char* p = path;
24
25 while (*p != '\0') {
26 const char* next_slash = p;
27 while (*next_slash != '\0' && *next_slash != '/' && *next_slash != '\\') {
28 ++next_slash;
29 }
30
31 bool is_src = Common::ComparePartialString(p, next_slash, root);
32 p = next_slash;
33
34 if (*p != '\0') {
35 ++p;
36 }
37 if (is_src) {
38 path = p;
39 }
40 }
41 return path;
42}
43
19void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len) { 44void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len) {
20 unsigned int time_seconds = static_cast<unsigned int>(entry.timestamp.count() / 1000000); 45 unsigned int time_seconds = static_cast<unsigned int>(entry.timestamp.count() / 1000000);
21 unsigned int time_fractional = static_cast<unsigned int>(entry.timestamp.count() % 1000000); 46 unsigned int time_fractional = static_cast<unsigned int>(entry.timestamp.count() % 1000000);
@@ -25,7 +50,7 @@ void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len) {
25 50
26 snprintf(out_text, text_len, "[%4u.%06u] %s <%s> %s: %s", 51 snprintf(out_text, text_len, "[%4u.%06u] %s <%s> %s: %s",
27 time_seconds, time_fractional, class_name, level_name, 52 time_seconds, time_fractional, class_name, level_name,
28 entry.location.c_str(), entry.message.c_str()); 53 TrimSourcePath(entry.location.c_str()), entry.message.c_str());
29} 54}
30 55
31static void ChangeConsoleColor(Level level) { 56static void ChangeConsoleColor(Level level) {
diff --git a/src/common/logging/text_formatter.h b/src/common/logging/text_formatter.h
index 6c2a6f1ea..04164600f 100644
--- a/src/common/logging/text_formatter.h
+++ b/src/common/logging/text_formatter.h
@@ -12,6 +12,18 @@ namespace Log {
12class Logger; 12class Logger;
13struct Entry; 13struct Entry;
14 14
15/**
16 * Attempts to trim an arbitrary prefix from `path`, leaving only the part starting at `root`. It's
17 * intended to be used to strip a system-specific build directory from the `__FILE__` macro,
18 * leaving only the path relative to the sources root.
19 *
20 * @param path The input file path as a null-terminated string
21 * @param root The name of the root source directory as a null-terminated string. Path up to and
22 * including the last occurence of this name will be stripped
23 * @return A pointer to the same string passed as `path`, but starting at the trimmed portion
24 */
25const char* TrimSourcePath(const char* path, const char* root = "src");
26
15/// Formats a log entry into the provided text buffer. 27/// Formats a log entry into the provided text buffer.
16void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len); 28void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len);
17/// Formats and prints a log entry to stderr. 29/// Formats and prints a log entry to stderr.
diff --git a/src/common/string_util.h b/src/common/string_util.h
index ae5bbadad..7d75691b1 100644
--- a/src/common/string_util.h
+++ b/src/common/string_util.h
@@ -115,4 +115,19 @@ inline std::string UTF8ToTStr(const std::string& str)
115 115
116#endif 116#endif
117 117
118/**
119 * Compares the string defined by the range [`begin`, `end`) to the null-terminated C-string
120 * `other` for equality.
121 */
122template <typename InIt>
123bool ComparePartialString(InIt begin, InIt end, const char* other) {
124 for (; begin != end && *other != '\0'; ++begin, ++other) {
125 if (*begin != *other) {
126 return false;
127 }
128 }
129 // Only return true if both strings finished at the same point
130 return (begin == end) == (*other == '\0');
131}
132
118} 133}