blob: 036950c1bd45510e3da705dcdc25961806f43a09 [file] [log] [blame]
//===---------------------AnsiTerminal.h ------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#define ANSI_FG_COLOR_BLACK 30
#define ANSI_FG_COLOR_RED 31
#define ANSI_FG_COLOR_GREEN 32
#define ANSI_FG_COLOR_YELLOW 33
#define ANSI_FG_COLOR_BLUE 34
#define ANSI_FG_COLOR_PURPLE 35
#define ANSI_FG_COLOR_CYAN 36
#define ANSI_FG_COLOR_WHITE 37
#define ANSI_BG_COLOR_BLACK 40
#define ANSI_BG_COLOR_RED 41
#define ANSI_BG_COLOR_GREEN 42
#define ANSI_BG_COLOR_YELLOW 43
#define ANSI_BG_COLOR_BLUE 44
#define ANSI_BG_COLOR_PURPLE 45
#define ANSI_BG_COLOR_CYAN 46
#define ANSI_BG_COLOR_WHITE 47
#define ANSI_SPECIAL_FRAMED 51
#define ANSI_SPECIAL_ENCIRCLED 52
#define ANSI_CTRL_NORMAL 0
#define ANSI_CTRL_BOLD 1
#define ANSI_CTRL_FAINT 2
#define ANSI_CTRL_ITALIC 3
#define ANSI_CTRL_UNDERLINE 4
#define ANSI_CTRL_SLOW_BLINK 5
#define ANSI_CTRL_FAST_BLINK 6
#define ANSI_CTRL_IMAGE_NEGATIVE 7
#define ANSI_CTRL_CONCEAL 8
#define ANSI_CTRL_CROSSED_OUT 9
#define ANSI_ESC_START "\033["
#define ANSI_ESC_END "m"
#define ANSI_1_CTRL(ctrl1) "\033["##ctrl1 ANSI_ESC_END
#define ANSI_2_CTRL(ctrl1,ctrl2) "\033["##ctrl1";"##ctrl2 ANSI_ESC_END
namespace lldb_utility {
namespace ansi {
const char *k_escape_start = "\033[";
const char *k_escape_end = "m";
const char *k_fg_black = "30";
const char *k_fg_red = "31";
const char *k_fg_green = "32";
const char *k_fg_yellow = "33";
const char *k_fg_blue = "34";
const char *k_fg_purple = "35";
const char *k_fg_cyan = "36";
const char *k_fg_white = "37";
const char *k_bg_black = "40";
const char *k_bg_red = "41";
const char *k_bg_green = "42";
const char *k_bg_yellow = "43";
const char *k_bg_blue = "44";
const char *k_bg_purple = "45";
const char *k_bg_cyan = "46";
const char *k_bg_white = "47";
const char *k_ctrl_normal = "0";
const char *k_ctrl_bold = "1";
const char *k_ctrl_faint = "2";
const char *k_ctrl_italic = "3";
const char *k_ctrl_underline = "4";
const char *k_ctrl_slow_blink = "5";
const char *k_ctrl_fast_blink = "6";
const char *k_ctrl_negative = "7";
const char *k_ctrl_conceal = "8";
const char *k_ctrl_crossed_out = "9";
inline std::string
FormatAnsiTerminalCodes(const char *format, bool do_color = true)
{
// Convert "${ansi.XXX}" tokens to ansi values or clear them if do_color is false.
static const struct
{
const char *name;
const char *value;
} g_color_tokens[] =
{
#define _TO_STR2(_val) #_val
#define _TO_STR(_val) _TO_STR2(_val)
{ "fg.black}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BLACK) ANSI_ESC_END },
{ "fg.red}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_RED) ANSI_ESC_END },
{ "fg.green}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_GREEN) ANSI_ESC_END },
{ "fg.yellow}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_YELLOW) ANSI_ESC_END },
{ "fg.blue}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BLUE) ANSI_ESC_END },
{ "fg.purple}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_PURPLE) ANSI_ESC_END },
{ "fg.cyan}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_CYAN) ANSI_ESC_END },
{ "fg.white}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_WHITE) ANSI_ESC_END },
{ "bg.black}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BLACK) ANSI_ESC_END },
{ "bg.red}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_RED) ANSI_ESC_END },
{ "bg.green}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_GREEN) ANSI_ESC_END },
{ "bg.yellow}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_YELLOW) ANSI_ESC_END },
{ "bg.blue}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BLUE) ANSI_ESC_END },
{ "bg.purple}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_PURPLE) ANSI_ESC_END },
{ "bg.cyan}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_CYAN) ANSI_ESC_END },
{ "bg.white}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_WHITE) ANSI_ESC_END },
{ "normal}", ANSI_ESC_START _TO_STR(ANSI_CTRL_NORMAL) ANSI_ESC_END },
{ "bold}", ANSI_ESC_START _TO_STR(ANSI_CTRL_BOLD) ANSI_ESC_END },
{ "faint}", ANSI_ESC_START _TO_STR(ANSI_CTRL_FAINT) ANSI_ESC_END },
{ "italic}", ANSI_ESC_START _TO_STR(ANSI_CTRL_ITALIC) ANSI_ESC_END },
{ "underline}", ANSI_ESC_START _TO_STR(ANSI_CTRL_UNDERLINE) ANSI_ESC_END },
{ "slow-blink}", ANSI_ESC_START _TO_STR(ANSI_CTRL_SLOW_BLINK) ANSI_ESC_END },
{ "fast-blink}", ANSI_ESC_START _TO_STR(ANSI_CTRL_FAST_BLINK) ANSI_ESC_END },
{ "negative}", ANSI_ESC_START _TO_STR(ANSI_CTRL_IMAGE_NEGATIVE) ANSI_ESC_END },
{ "conceal}", ANSI_ESC_START _TO_STR(ANSI_CTRL_CONCEAL) ANSI_ESC_END },
{ "crossed-out}", ANSI_ESC_START _TO_STR(ANSI_CTRL_CROSSED_OUT) ANSI_ESC_END },
#undef _TO_STR
#undef _TO_STR2
};
static const char tok_hdr[] = "${ansi.";
std::string fmt;
for (const char *p = format; *p; ++p)
{
const char *tok_start = strstr (p, tok_hdr);
if (!tok_start)
{
fmt.append (p, strlen(p));
break;
}
fmt.append (p, tok_start - p);
p = tok_start;
const char *tok_str = tok_start + sizeof(tok_hdr) - 1;
for (size_t i = 0; i < sizeof(g_color_tokens) / sizeof(g_color_tokens[0]); ++i)
{
if (!strncmp (tok_str, g_color_tokens[i].name, strlen(g_color_tokens[i].name)))
{
if (do_color)
fmt.append (g_color_tokens[i].value);
p = tok_str + strlen (g_color_tokens[i].name) - 1;
break;
}
}
}
return fmt;
}
}
}