Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:42:56

0001 //===---------------------AnsiTerminal.h ------------------------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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   // Convert "${ansi.XXX}" tokens to ansi values or clear them if do_color is
0086   // false.
0087   // clang-format off
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   // clang-format on
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       // The header was not found.  Just exit.
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     // If we haven't found a valid replacement value, we just copy the string
0168     // to the result without any modifications.
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     // ANSI_ESC_START not found.
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       // ANSI_ESC_END not found.
0192       stripped += ANSI_ESC_START;
0193       str = right;
0194     }
0195   }
0196   return stripped;
0197 }
0198 
0199 } // namespace ansi
0200 } // namespace lldb_private
0201 
0202 #endif