AnsiTerminal.h revision 17d5a0358d60922707fdab6ec9c3251ca44dd614
1//===---------------------AnsiTerminal.h ------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10
11
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
20
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
29
30#define ANSI_SPECIAL_FRAMED         51
31#define ANSI_SPECIAL_ENCIRCLED      52
32
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
43
44#define ANSI_ESC_START          "\033["
45#define ANSI_ESC_END            "m"
46
47#define ANSI_1_CTRL(ctrl1)          "\033["##ctrl1 ANSI_ESC_END
48#define ANSI_2_CTRL(ctrl1,ctrl2)    "\033["##ctrl1";"##ctrl2 ANSI_ESC_END
49
50namespace lldb_utility {
51
52    namespace ansi {
53        const char *k_escape_start	 = "\033[";
54        const char *k_escape_end	 = "m";
55
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";
64
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";
73
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";
84
85        inline std::string
86        FormatAnsiTerminalCodes(const char *format, bool do_color = true)
87        {
88            // Convert "${ansi.XXX}" tokens to ansi values or clear them if do_color is false.
89            static const struct
90            {
91                const char *name;
92                const char *value;
93            } g_color_tokens[] =
94            {
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 },
123        #undef _TO_STR
124        #undef _TO_STR2
125            };
126            static const char tok_hdr[] = "${ansi.";
127
128            std::string fmt;
129            for (const char *p = format; *p; ++p)
130            {
131                const char *tok_start = strstr (p, tok_hdr);
132                if (!tok_start)
133                {
134                    fmt.append (p, strlen(p));
135                    break;
136                }
137
138                fmt.append (p, tok_start - p);
139                p = tok_start;
140
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)
143                {
144                    if (!strncmp (tok_str, g_color_tokens[i].name, strlen(g_color_tokens[i].name)))
145                    {
146                        if (do_color)
147                            fmt.append (g_color_tokens[i].value);
148                        p = tok_str + strlen (g_color_tokens[i].name) - 1;
149                        break;
150                    }
151                }
152            }
153            return fmt;
154        }
155    }
156}
157