log: use ANSI colors for strings containing "warning" or "error"

This commit is contained in:
Eric Wasylishen 2022-04-03 12:56:11 -06:00
parent ccac9d4979
commit 24ca07188c
3 changed files with 33 additions and 3 deletions

View File

@ -37,6 +37,7 @@
#include <cstdint>
#include <algorithm>
#include <string>
/* set these before calling CheckParm */
@ -405,4 +406,15 @@ bool natstrlt(const char *s1, const char *s2, bool case_sensitive)
if (*p1 != 0 && *p2 == 0)
return false;
return false;
}
}
std::string_view::const_iterator string_ifind(std::string_view haystack, std::string_view needle)
{
return std::search(haystack.begin(), haystack.end(), needle.begin(), needle.end(),
[](char a, char b) { return tolower(a) == tolower(b); });
}
bool string_icontains(std::string_view haystack, std::string_view needle)
{
return string_ifind(haystack, needle) != haystack.end();
}

View File

@ -68,6 +68,19 @@ void print(flag logflag, const char *str)
return;
}
static const char *escape_red = "\033[31m";
static const char *escape_yellow = "\033[33m";
static const char *escape_reset = "\033[0m";
std::string ansi_str;
if (string_icontains(str, "error")) {
ansi_str = fmt::format("{}{}{}", escape_red, str, escape_reset);
} else if (string_icontains(str, "warning")) {
ansi_str = fmt::format("{}{}{}", escape_yellow, str, escape_reset);
} else {
ansi_str = str;
}
print_mutex.lock();
if (logflag != flag::PERCENT) {
@ -79,12 +92,12 @@ void print(flag logflag, const char *str)
#ifdef _WIN32
// print to windows console
OutputDebugStringA(str);
OutputDebugStringA(ansi_str.c_str());
#endif
}
// stdout
std::cout << str;
std::cout << ansi_str;
print_mutex.unlock();
}

View File

@ -136,6 +136,11 @@ struct natural_case_insensitive_less
bool operator()(const std::string &l, const std::string &r) const noexcept { return stlnatstrlt(l, r, false); }
};
#include <string_view>
std::string_view::const_iterator string_ifind(std::string_view haystack, std::string_view needle);
bool string_icontains(std::string_view haystack, std::string_view needle);
#include <chrono>
using qclock = std::chrono::high_resolution_clock;