summaryrefslogtreecommitdiff
path: root/indra/llcommon/llerror.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon/llerror.cpp')
-rw-r--r--indra/llcommon/llerror.cpp58
1 files changed, 32 insertions, 26 deletions
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 335a0995fe..b46f49ba34 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -181,32 +181,35 @@ namespace {
return LLError::getEnabledLogTypesMask() & 0x04;
}
+ LL_FORCE_INLINE std::string createANSI(const std::string& color)
+ {
+ std::string ansi_code;
+ ansi_code += '\033';
+ ansi_code += "[";
+ ansi_code += color;
+ ansi_code += "m";
+ return ansi_code;
+ }
+
virtual void recordMessage(LLError::ELevel level,
const std::string& message) override
- {
- if (ANSI_PROBE == mUseANSI)
- mUseANSI = (checkANSI() ? ANSI_YES : ANSI_NO);
+ {
+ static std::string s_ansi_error = createANSI("31"); // red
+ static std::string s_ansi_warn = createANSI("34"); // blue
+ static std::string s_ansi_debug = createANSI("35"); // magenta
+
+ mUseANSI = (ANSI_PROBE == mUseANSI) ? (checkANSI() ? ANSI_YES : ANSI_NO) : mUseANSI;
if (ANSI_YES == mUseANSI)
{
- // Default all message levels to bold so we can distinguish our own messages from those dumped by subprocesses and libraries.
- colorANSI("1"); // bold
- switch (level) {
- case LLError::LEVEL_ERROR:
- colorANSI("31"); // red
- break;
- case LLError::LEVEL_WARN:
- colorANSI("34"); // blue
- break;
- case LLError::LEVEL_DEBUG:
- colorANSI("35"); // magenta
- break;
- default:
- break;
- }
+ writeANSI((level == LLError::LEVEL_ERROR) ? s_ansi_error :
+ (level == LLError::LEVEL_WARN) ? s_ansi_warn :
+ s_ansi_debug, message);
}
- fprintf(stderr, "%s\n", message.c_str());
- if (ANSI_YES == mUseANSI) colorANSI("0"); // reset
+ else
+ {
+ fprintf(stderr, "%s\n", message.c_str());
+ }
}
private:
@@ -217,11 +220,14 @@ namespace {
ANSI_NO
} mUseANSI;
- void colorANSI(const std::string color)
+ LL_FORCE_INLINE void writeANSI(const std::string& ansi_code, const std::string& message)
{
- // ANSI color code escape sequence
- fprintf(stderr, "\033[%sm", color.c_str() );
- };
+ static std::string s_ansi_bold = createANSI("1"); // bold
+ static std::string s_ansi_reset = createANSI("0"); // reset
+ // ANSI color code escape sequence, message, and reset in one fprintf call
+ // Default all message levels to bold so we can distinguish our own messages from those dumped by subprocesses and libraries.
+ fprintf(stderr, "%s%s%s\n%s", s_ansi_bold.c_str(), ansi_code.c_str(), message.c_str(), s_ansi_reset.c_str() );
+ }
bool checkANSI(void)
{
@@ -232,8 +238,8 @@ namespace {
return (0 != isatty(2)) &&
(NULL == getenv("LL_NO_ANSI_COLOR"));
#endif // LL_LINUX
- return false;
- };
+ return FALSE; // works in a cygwin shell... ;)
+ }
};
class RecordToFixedBuffer : public LLError::Recorder