File indexing completed on 2026-05-10 08:42:56
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLDB_UTILITY_ANSITERMINAL_H
0010 #define LLDB_UTILITY_ANSITERMINAL_H
0011
0012 #define ANSI_FG_COLOR_BLACK 30
0013 #define ANSI_FG_COLOR_RED 31
0014 #define ANSI_FG_COLOR_GREEN 32
0015 #define ANSI_FG_COLOR_YELLOW 33
0016 #define ANSI_FG_COLOR_BLUE 34
0017 #define ANSI_FG_COLOR_PURPLE 35
0018 #define ANSI_FG_COLOR_CYAN 36
0019 #define ANSI_FG_COLOR_WHITE 37
0020
0021 #define ANSI_FG_COLOR_BRIGHT_BLACK 90
0022 #define ANSI_FG_COLOR_BRIGHT_RED 91
0023 #define ANSI_FG_COLOR_BRIGHT_GREEN 92
0024 #define ANSI_FG_COLOR_BRIGHT_YELLOW 93
0025 #define ANSI_FG_COLOR_BRIGHT_BLUE 94
0026 #define ANSI_FG_COLOR_BRIGHT_PURPLE 95
0027 #define ANSI_FG_COLOR_BRIGHT_CYAN 96
0028 #define ANSI_FG_COLOR_BRIGHT_WHITE 97
0029
0030 #define ANSI_BG_COLOR_BLACK 40
0031 #define ANSI_BG_COLOR_RED 41
0032 #define ANSI_BG_COLOR_GREEN 42
0033 #define ANSI_BG_COLOR_YELLOW 43
0034 #define ANSI_BG_COLOR_BLUE 44
0035 #define ANSI_BG_COLOR_PURPLE 45
0036 #define ANSI_BG_COLOR_CYAN 46
0037 #define ANSI_BG_COLOR_WHITE 47
0038
0039 #define ANSI_BG_COLOR_BRIGHT_BLACK 100
0040 #define ANSI_BG_COLOR_BRIGHT_RED 101
0041 #define ANSI_BG_COLOR_BRIGHT_GREEN 102
0042 #define ANSI_BG_COLOR_BRIGHT_YELLOW 103
0043 #define ANSI_BG_COLOR_BRIGHT_BLUE 104
0044 #define ANSI_BG_COLOR_BRIGHT_PURPLE 105
0045 #define ANSI_BG_COLOR_BRIGHT_CYAN 106
0046 #define ANSI_BG_COLOR_BRIGHT_WHITE 107
0047
0048 #define ANSI_SPECIAL_FRAMED 51
0049 #define ANSI_SPECIAL_ENCIRCLED 52
0050
0051 #define ANSI_CTRL_NORMAL 0
0052 #define ANSI_CTRL_BOLD 1
0053 #define ANSI_CTRL_FAINT 2
0054 #define ANSI_CTRL_ITALIC 3
0055 #define ANSI_CTRL_UNDERLINE 4
0056 #define ANSI_CTRL_SLOW_BLINK 5
0057 #define ANSI_CTRL_FAST_BLINK 6
0058 #define ANSI_CTRL_IMAGE_NEGATIVE 7
0059 #define ANSI_CTRL_CONCEAL 8
0060 #define ANSI_CTRL_CROSSED_OUT 9
0061
0062 #define ANSI_ESC_START "\033["
0063 #define ANSI_ESC_END "m"
0064
0065 #define ANSI_STR(s) #s
0066 #define ANSI_DEF_STR(s) ANSI_STR(s)
0067
0068 #define ANSI_ESCAPE1(s) ANSI_ESC_START ANSI_DEF_STR(s) ANSI_ESC_END
0069
0070 #define ANSI_1_CTRL(ctrl1) "\033["##ctrl1 ANSI_ESC_END
0071 #define ANSI_2_CTRL(ctrl1, ctrl2) "\033["##ctrl1 ";"##ctrl2 ANSI_ESC_END
0072
0073 #include "llvm/ADT/ArrayRef.h"
0074 #include "llvm/ADT/STLExtras.h"
0075 #include "llvm/ADT/StringRef.h"
0076
0077 #include <string>
0078
0079 namespace lldb_private {
0080
0081 namespace ansi {
0082
0083 inline std::string FormatAnsiTerminalCodes(llvm::StringRef format,
0084 bool do_color = true) {
0085
0086
0087
0088 static const struct {
0089 const char *name;
0090 const char *value;
0091 } g_color_tokens[] = {
0092 #define _TO_STR2(_val) #_val
0093 #define _TO_STR(_val) _TO_STR2(_val)
0094 {"fg.black}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BLACK) ANSI_ESC_END},
0095 {"fg.red}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_RED) ANSI_ESC_END},
0096 {"fg.green}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_GREEN) ANSI_ESC_END},
0097 {"fg.yellow}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_YELLOW) ANSI_ESC_END},
0098 {"fg.blue}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BLUE) ANSI_ESC_END},
0099 {"fg.purple}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_PURPLE) ANSI_ESC_END},
0100 {"fg.cyan}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_CYAN) ANSI_ESC_END},
0101 {"fg.white}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_WHITE) ANSI_ESC_END},
0102 {"fg.bright.black}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_BLACK) ANSI_ESC_END},
0103 {"fg.bright.red}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_RED) ANSI_ESC_END},
0104 {"fg.bright.green}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_GREEN) ANSI_ESC_END},
0105 {"fg.bright.yellow}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_YELLOW) ANSI_ESC_END},
0106 {"fg.bright.blue}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_BLUE) ANSI_ESC_END},
0107 {"fg.bright.purple}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_PURPLE) ANSI_ESC_END},
0108 {"fg.bright.cyan}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_CYAN) ANSI_ESC_END},
0109 {"fg.bright.white}", ANSI_ESC_START _TO_STR(ANSI_FG_COLOR_BRIGHT_WHITE) ANSI_ESC_END},
0110 {"bg.black}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BLACK) ANSI_ESC_END},
0111 {"bg.red}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_RED) ANSI_ESC_END},
0112 {"bg.green}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_GREEN) ANSI_ESC_END},
0113 {"bg.yellow}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_YELLOW) ANSI_ESC_END},
0114 {"bg.blue}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BLUE) ANSI_ESC_END},
0115 {"bg.purple}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_PURPLE) ANSI_ESC_END},
0116 {"bg.cyan}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_CYAN) ANSI_ESC_END},
0117 {"bg.white}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_WHITE) ANSI_ESC_END},
0118 {"bg.bright.black}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_BLACK) ANSI_ESC_END},
0119 {"bg.bright.red}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_RED) ANSI_ESC_END},
0120 {"bg.bright.green}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_GREEN) ANSI_ESC_END},
0121 {"bg.bright.yellow}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_YELLOW) ANSI_ESC_END},
0122 {"bg.bright.blue}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_BLUE) ANSI_ESC_END},
0123 {"bg.bright.purple}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_PURPLE) ANSI_ESC_END},
0124 {"bg.bright.cyan}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_CYAN) ANSI_ESC_END},
0125 {"bg.bright.white}", ANSI_ESC_START _TO_STR(ANSI_BG_COLOR_BRIGHT_WHITE) ANSI_ESC_END},
0126 {"normal}", ANSI_ESC_START _TO_STR(ANSI_CTRL_NORMAL) ANSI_ESC_END},
0127 {"bold}", ANSI_ESC_START _TO_STR(ANSI_CTRL_BOLD) ANSI_ESC_END},
0128 {"faint}", ANSI_ESC_START _TO_STR(ANSI_CTRL_FAINT) ANSI_ESC_END},
0129 {"italic}", ANSI_ESC_START _TO_STR(ANSI_CTRL_ITALIC) ANSI_ESC_END},
0130 {"underline}", ANSI_ESC_START _TO_STR(ANSI_CTRL_UNDERLINE) ANSI_ESC_END},
0131 {"slow-blink}", ANSI_ESC_START _TO_STR(ANSI_CTRL_SLOW_BLINK) ANSI_ESC_END},
0132 {"fast-blink}", ANSI_ESC_START _TO_STR(ANSI_CTRL_FAST_BLINK) ANSI_ESC_END},
0133 {"negative}", ANSI_ESC_START _TO_STR(ANSI_CTRL_IMAGE_NEGATIVE) ANSI_ESC_END},
0134 {"conceal}", ANSI_ESC_START _TO_STR(ANSI_CTRL_CONCEAL) ANSI_ESC_END},
0135 {"crossed-out}", ANSI_ESC_START _TO_STR(ANSI_CTRL_CROSSED_OUT) ANSI_ESC_END},
0136 #undef _TO_STR
0137 #undef _TO_STR2
0138 };
0139
0140 auto codes = llvm::ArrayRef(g_color_tokens);
0141
0142 static const char tok_hdr[] = "${ansi.";
0143
0144 std::string fmt;
0145 while (!format.empty()) {
0146 llvm::StringRef left, right;
0147 std::tie(left, right) = format.split(tok_hdr);
0148
0149 fmt += left;
0150
0151 if (left == format && right.empty()) {
0152
0153 break;
0154 }
0155
0156 bool found_code = false;
0157 for (const auto &code : codes) {
0158 if (!right.consume_front(code.name))
0159 continue;
0160
0161 if (do_color)
0162 fmt.append(code.value);
0163 found_code = true;
0164 break;
0165 }
0166 format = right;
0167
0168
0169 if (!found_code)
0170 fmt.append(tok_hdr);
0171 }
0172 return fmt;
0173 }
0174
0175 inline std::string StripAnsiTerminalCodes(llvm::StringRef str) {
0176 std::string stripped;
0177 while (!str.empty()) {
0178 llvm::StringRef left, right;
0179
0180 std::tie(left, right) = str.split(ANSI_ESC_START);
0181 stripped += left;
0182
0183
0184 if (left == str && right.empty())
0185 break;
0186
0187 size_t end = right.find_first_not_of("0123456789;");
0188 if (end < right.size() && (right[end] == 'm' || right[end] == 'G')) {
0189 str = right.substr(end + 1);
0190 } else {
0191
0192 stripped += ANSI_ESC_START;
0193 str = right;
0194 }
0195 }
0196 return stripped;
0197 }
0198
0199 }
0200 }
0201
0202 #endif