diff options
author | Edwin Török <edwintorok@gmail.com> | 2009-06-04 07:09:50 +0000 |
---|---|---|
committer | Edwin Török <edwintorok@gmail.com> | 2009-06-04 07:09:50 +0000 |
commit | 8a06a5bdc1eb7375bddbe3ed5c377c72842dc75c (patch) | |
tree | e95ec82d472d32e37882e836f167990a044b8bbd /lib/System/Unix | |
parent | 65b8822f0fc2f189ac50028627c5642f819012bb (diff) | |
download | external_llvm-8a06a5bdc1eb7375bddbe3ed5c377c72842dc75c.zip external_llvm-8a06a5bdc1eb7375bddbe3ed5c377c72842dc75c.tar.gz external_llvm-8a06a5bdc1eb7375bddbe3ed5c377c72842dc75c.tar.bz2 |
Add support for outputting ANSI colors to raw_fd_ostream.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72854 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Unix')
-rw-r--r-- | lib/System/Unix/Process.inc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/System/Unix/Process.inc b/lib/System/Unix/Process.inc index 74b9bb8..2da31c9 100644 --- a/lib/System/Unix/Process.inc +++ b/lib/System/Unix/Process.inc @@ -235,3 +235,62 @@ unsigned Process::StandardErrColumns() { return getColumns(2); } + +static bool terminalHasColors() { + if (const char *term = std::getenv("TERM")) { + // Most modern terminals support ANSI escape sequences for colors. + // We could check terminfo, or have a list of known terms that support + // colors, but that would be overkill. + // The user can always ask for no colors by setting TERM to dumb, or + // using a commandline flag. + return strcmp(term, "dumb") != 0; + } + return false; +} + +bool Process::StandardOutHasColors() { + if (!StandardOutIsDisplayed()) + return false; + return terminalHasColors(); +} + +bool Process::StandardErrHasColors() { + if (!StandardErrIsDisplayed()) + return false; + return terminalHasColors(); +} + +bool Process::ColorNeedsFlush() { + // No, we use ANSI escape sequences. + return false; +} + +#define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m" + +#define ALLCOLORS(FGBG,BOLD) {\ + COLOR(FGBG, "0", BOLD),\ + COLOR(FGBG, "1", BOLD),\ + COLOR(FGBG, "2", BOLD),\ + COLOR(FGBG, "3", BOLD),\ + COLOR(FGBG, "4", BOLD),\ + COLOR(FGBG, "5", BOLD),\ + COLOR(FGBG, "6", BOLD),\ + COLOR(FGBG, "7", BOLD)\ + } + +static const char* colorcodes[2][2][8] = { + { ALLCOLORS("3",""), ALLCOLORS("3","1;") }, + { ALLCOLORS("4",""), ALLCOLORS("4","1;") } +}; + +const char *Process::OutputColor(char code, bool bold, bool bg) { + return colorcodes[bg?1:0][bold?1:0][code&7]; +} + +const char *Process::OutputBold(bool bg) { + return "\033[1m"; +} + +const char *Process::ResetColor() { + return "\033[0m"; +} |