1 //===---------------------AnsiTerminal.h ------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 #define ANSI_FG_COLOR_BLACK 30
13 #define ANSI_FG_COLOR_RED 31
14 #define ANSI_FG_COLOR_GREEN 32
15 #define ANSI_FG_COLOR_YELLOW 33
16 #define ANSI_FG_COLOR_BLUE 34
17 #define ANSI_FG_COLOR_PURPLE 35
18 #define ANSI_FG_COLOR_CYAN 36
19 #define ANSI_FG_COLOR_WHITE 37
21 #define ANSI_BG_COLOR_BLACK 40
22 #define ANSI_BG_COLOR_RED 41
23 #define ANSI_BG_COLOR_GREEN 42
24 #define ANSI_BG_COLOR_YELLOW 43
25 #define ANSI_BG_COLOR_BLUE 44
26 #define ANSI_BG_COLOR_PURPLE 45
27 #define ANSI_BG_COLOR_CYAN 46
28 #define ANSI_BG_COLOR_WHITE 47
30 #define ANSI_SPECIAL_FRAMED 51
31 #define ANSI_SPECIAL_ENCIRCLED 52
33 #define ANSI_CTRL_NORMAL 0
34 #define ANSI_CTRL_BOLD 1
35 #define ANSI_CTRL_FAINT 2
36 #define ANSI_CTRL_ITALIC 3
37 #define ANSI_CTRL_UNDERLINE 4
38 #define ANSI_CTRL_SLOW_BLINK 5
39 #define ANSI_CTRL_FAST_BLINK 6
40 #define ANSI_CTRL_IMAGE_NEGATIVE 7
41 #define ANSI_CTRL_CONCEAL 8
42 #define ANSI_CTRL_CROSSED_OUT 9
44 #define ANSI_ESC_START "\033["
45 #define ANSI_ESC_END "m"
47 #define ANSI_1_CTRL(ctrl1) "\033["##ctrl1 ANSI_ESC_END
48 #define ANSI_2_CTRL(ctrl1,ctrl2) "\033["##ctrl1";"##ctrl2 ANSI_ESC_END
50 namespace lldb_utility {
53 const char *k_escape_start = "\033[";
54 const char *k_escape_end = "m";
56 const char *k_fg_black = "30";
57 const char *k_fg_red = "31";
58 const char *k_fg_green = "32";
59 const char *k_fg_yellow = "33";
60 const char *k_fg_blue = "34";
61 const char *k_fg_purple = "35";
62 const char *k_fg_cyan = "36";
63 const char *k_fg_white = "37";
65 const char *k_bg_black = "40";
66 const char *k_bg_red = "41";
67 const char *k_bg_green = "42";
68 const char *k_bg_yellow = "43";
69 const char *k_bg_blue = "44";
70 const char *k_bg_purple = "45";
71 const char *k_bg_cyan = "46";
72 const char *k_bg_white = "47";
74 const char *k_ctrl_normal = "0";
75 const char *k_ctrl_bold = "1";
76 const char *k_ctrl_faint = "2";
77 const char *k_ctrl_italic = "3";
78 const char *k_ctrl_underline = "4";
79 const char *k_ctrl_slow_blink = "5";
80 const char *k_ctrl_fast_blink = "6";
81 const char *k_ctrl_negative = "7";
82 const char *k_ctrl_conceal = "8";
83 const char *k_ctrl_crossed_out = "9";
86 FormatAnsiTerminalCodes(const char *format, bool do_color = true)
88 // Convert "${ansi.XXX}" tokens to ansi values or clear them if do_color is false.
95 #define _TO_STR2(_val) #_val
96 #define _TO_STR(_val) _TO_STR2(_val)
97 { "fg.black}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BLACK) ANSI_ESC_END },
98 { "fg.red}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_RED) ANSI_ESC_END },
99 { "fg.green}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_GREEN) ANSI_ESC_END },
100 { "fg.yellow}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_YELLOW) ANSI_ESC_END },
101 { "fg.blue}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BLUE) ANSI_ESC_END },
102 { "fg.purple}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_PURPLE) ANSI_ESC_END },
103 { "fg.cyan}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_CYAN) ANSI_ESC_END },
104 { "fg.white}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_WHITE) ANSI_ESC_END },
105 { "bg.black}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BLACK) ANSI_ESC_END },
106 { "bg.red}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_RED) ANSI_ESC_END },
107 { "bg.green}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_GREEN) ANSI_ESC_END },
108 { "bg.yellow}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_YELLOW) ANSI_ESC_END },
109 { "bg.blue}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BLUE) ANSI_ESC_END },
110 { "bg.purple}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_PURPLE) ANSI_ESC_END },
111 { "bg.cyan}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_CYAN) ANSI_ESC_END },
112 { "bg.white}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_WHITE) ANSI_ESC_END },
113 { "normal}", ANSI_ESC_START _TO_STR(ANSI_CTRL_NORMAL) ANSI_ESC_END },
114 { "bold}", ANSI_ESC_START _TO_STR(ANSI_CTRL_BOLD) ANSI_ESC_END },
115 { "faint}", ANSI_ESC_START _TO_STR(ANSI_CTRL_FAINT) ANSI_ESC_END },
116 { "italic}", ANSI_ESC_START _TO_STR(ANSI_CTRL_ITALIC) ANSI_ESC_END },
117 { "underline}", ANSI_ESC_START _TO_STR(ANSI_CTRL_UNDERLINE) ANSI_ESC_END },
118 { "slow-blink}", ANSI_ESC_START _TO_STR(ANSI_CTRL_SLOW_BLINK) ANSI_ESC_END },
119 { "fast-blink}", ANSI_ESC_START _TO_STR(ANSI_CTRL_FAST_BLINK) ANSI_ESC_END },
120 { "negative}", ANSI_ESC_START _TO_STR(ANSI_CTRL_IMAGE_NEGATIVE) ANSI_ESC_END },
121 { "conceal}", ANSI_ESC_START _TO_STR(ANSI_CTRL_CONCEAL) ANSI_ESC_END },
122 { "crossed-out}", ANSI_ESC_START _TO_STR(ANSI_CTRL_CROSSED_OUT) ANSI_ESC_END },
126 static const char tok_hdr[] = "${ansi.";
129 for (const char *p = format; *p; ++p)
131 const char *tok_start = strstr (p, tok_hdr);
134 fmt.append (p, strlen(p));
138 fmt.append (p, tok_start - p);
141 const char *tok_str = tok_start + sizeof(tok_hdr) - 1;
142 for (size_t i = 0; i < sizeof(g_color_tokens) / sizeof(g_color_tokens[0]); ++i)
144 if (!strncmp (tok_str, g_color_tokens[i].name, strlen(g_color_tokens[i].name)))
147 fmt.append (g_color_tokens[i].value);
148 p = tok_str + strlen (g_color_tokens[i].name) - 1;