arm: clean up some legacy FPA related cruft.
[official-gcc.git] / gcc / text-art / theme.cc
blobe51b8ef7a84cee23f1fbe70c00e82d05c6b60cb2
1 /* Classes for abstracting ascii vs unicode output.
2 Copyright (C) 2023-2024 Free Software Foundation, Inc.
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #define INCLUDE_VECTOR
23 #include "system.h"
24 #include "coretypes.h"
25 #include "pretty-print.h"
26 #include "selftest.h"
27 #include "text-art/selftests.h"
28 #include "text-art/ruler.h"
29 #include "text-art/theme.h"
31 using namespace text_art;
33 /* class theme. */
35 void
36 theme::paint_y_arrow (canvas &canvas,
37 int canvas_x,
38 canvas::range_t y_range,
39 y_arrow_dir dir,
40 style::id_t style_id) const
42 int canvas_y;
43 int delta_y;
44 const canvas::cell_t head (get_cppchar (dir == y_arrow_dir::UP
45 ? cell_kind::Y_ARROW_UP_HEAD
46 : cell_kind::Y_ARROW_DOWN_HEAD),
47 false, style_id);
48 const canvas::cell_t tail (get_cppchar (dir == y_arrow_dir::UP
49 ? cell_kind::Y_ARROW_UP_TAIL
50 : cell_kind::Y_ARROW_DOWN_TAIL),
51 false, style_id);
52 if (dir == y_arrow_dir::UP)
54 canvas_y = y_range.get_max ();
55 delta_y = -1;
57 else
59 canvas_y = y_range.get_min ();
60 delta_y = 1;
62 for (int len = y_range.get_size (); len; len--)
64 const canvas::cell_t cell = (len > 1) ? tail : head;
65 canvas.paint (canvas::coord_t (canvas_x, canvas_y), cell);
66 canvas_y += delta_y;
70 /* class ascii_theme : public theme. */
72 canvas::cell_t
73 ascii_theme::get_line_art (directions line_dirs) const
75 if (line_dirs.m_up
76 && line_dirs.m_down
77 && !(line_dirs.m_left || line_dirs.m_right))
78 return canvas::cell_t ('|');
79 if (line_dirs.m_left
80 && line_dirs.m_right
81 && !(line_dirs.m_up || line_dirs.m_down))
82 return canvas::cell_t ('-');
83 if (line_dirs.m_up
84 || line_dirs.m_down
85 || line_dirs.m_left
86 || line_dirs.m_right)
87 return canvas::cell_t ('+');
88 return canvas::cell_t (' ');
91 cppchar_t
92 ascii_theme::get_cppchar (enum cell_kind kind) const
94 switch (kind)
96 default:
97 gcc_unreachable ();
98 case cell_kind::X_RULER_LEFT_EDGE:
99 return '|';
100 case cell_kind::X_RULER_MIDDLE:
101 return '~';
102 case cell_kind::X_RULER_INTERNAL_EDGE:
103 return '|';
104 case cell_kind::X_RULER_CONNECTOR_TO_LABEL_BELOW:
105 case cell_kind::X_RULER_CONNECTOR_TO_LABEL_ABOVE:
106 return '+';
107 case cell_kind::X_RULER_RIGHT_EDGE:
108 return '|';
109 case cell_kind::X_RULER_VERTICAL_CONNECTOR:
110 return '|';
112 case cell_kind::TEXT_BORDER_HORIZONTAL:
113 return '-';
114 case cell_kind::TEXT_BORDER_VERTICAL:
115 return '|';
116 case cell_kind::TEXT_BORDER_TOP_LEFT:
117 case cell_kind::TEXT_BORDER_TOP_RIGHT:
118 case cell_kind::TEXT_BORDER_BOTTOM_LEFT:
119 case cell_kind::TEXT_BORDER_BOTTOM_RIGHT:
120 return '+';
122 case cell_kind::Y_ARROW_UP_HEAD: return '^';
123 case cell_kind::Y_ARROW_DOWN_HEAD: return 'v';
125 case cell_kind::Y_ARROW_UP_TAIL:
126 case cell_kind::Y_ARROW_DOWN_TAIL:
127 return '|';
129 case cell_kind::INTERPROCEDURAL_PUSH_FRAME_LEFT:
130 return '+';
131 case cell_kind::INTERPROCEDURAL_PUSH_FRAME_MIDDLE:
132 return '-';
133 case cell_kind::INTERPROCEDURAL_PUSH_FRAME_RIGHT:
134 return '>';
135 case cell_kind::INTERPROCEDURAL_DEPTH_MARKER:
136 return '|';
137 case cell_kind::INTERPROCEDURAL_POP_FRAMES_LEFT:
138 return '<';
139 case cell_kind::INTERPROCEDURAL_POP_FRAMES_MIDDLE:
140 return '-';
141 case cell_kind::INTERPROCEDURAL_POP_FRAMES_RIGHT:
142 return '+';
144 case cell_kind::CFG_RIGHT:
145 return '-';
146 case cell_kind::CFG_FROM_RIGHT_TO_DOWN:
147 return '+';
148 case cell_kind::CFG_DOWN:
149 return '|';
150 case cell_kind::CFG_FROM_DOWN_TO_LEFT:
151 return '+';
152 case cell_kind::CFG_LEFT:
153 return '-';
154 case cell_kind::CFG_FROM_LEFT_TO_DOWN:
155 return '+';
156 case cell_kind::CFG_FROM_DOWN_TO_RIGHT:
157 return '+';
159 case cell_kind::TREE_CHILD_NON_FINAL:
160 return '+';
161 case cell_kind::TREE_CHILD_FINAL:
162 return '`';
163 case cell_kind::TREE_X_CONNECTOR:
164 return '-';
165 case cell_kind::TREE_Y_CONNECTOR:
166 return '|';
170 /* class unicode_theme : public theme. */
172 canvas::cell_t
173 unicode_theme::get_line_art (directions line_dirs) const
175 return canvas::cell_t (get_box_drawing_char (line_dirs));
178 cppchar_t
179 unicode_theme::get_cppchar (enum cell_kind kind) const
181 switch (kind)
183 default:
184 gcc_unreachable ();
185 case cell_kind::X_RULER_LEFT_EDGE:
186 return 0x251C; /* "├": U+251C: BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
187 case cell_kind::X_RULER_MIDDLE:
188 return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */
189 case cell_kind::X_RULER_INTERNAL_EDGE:
190 return 0x253C; /* "┼": U+253C: BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
191 case cell_kind::X_RULER_CONNECTOR_TO_LABEL_BELOW:
192 return 0x252C; /* "┬": U+252C: BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
193 case cell_kind::X_RULER_CONNECTOR_TO_LABEL_ABOVE:
194 return 0x2534; /* "┴": U+2534: BOX DRAWINGS LIGHT UP AND HORIZONTAL */
195 case cell_kind::X_RULER_RIGHT_EDGE:
196 return 0x2524; /* "┤": U+2524: BOX DRAWINGS LIGHT VERTICAL AND LEFT */
197 case cell_kind::X_RULER_VERTICAL_CONNECTOR:
198 return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */
200 case cell_kind::TEXT_BORDER_HORIZONTAL:
201 return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */
202 case cell_kind::TEXT_BORDER_VERTICAL:
203 return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */
205 /* Round corners. */
206 case cell_kind::TEXT_BORDER_TOP_LEFT:
207 return 0x256D; /* "╭": U+256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT. */
208 case cell_kind::TEXT_BORDER_TOP_RIGHT:
209 return 0x256E; /* "╮": U+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT. */
210 case cell_kind::TEXT_BORDER_BOTTOM_LEFT:
211 return 0x2570; /* "╰": U+2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT. */
212 case cell_kind::TEXT_BORDER_BOTTOM_RIGHT:
213 return 0x256F; /* "╯": U+256F BOX DRAWINGS LIGHT ARC UP AND LEFT. */
215 case cell_kind::Y_ARROW_UP_HEAD:
216 return '^';
217 case cell_kind::Y_ARROW_DOWN_HEAD:
218 return 'v';
219 case cell_kind::Y_ARROW_UP_TAIL:
220 case cell_kind::Y_ARROW_DOWN_TAIL:
221 return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */
223 case cell_kind::INTERPROCEDURAL_PUSH_FRAME_LEFT:
224 return 0x2514; /* "└": U+2514: BOX DRAWINGS LIGHT UP AND RIGHT */
225 case cell_kind::INTERPROCEDURAL_PUSH_FRAME_MIDDLE:
226 return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */
227 case cell_kind::INTERPROCEDURAL_PUSH_FRAME_RIGHT:
228 return '>';
229 case cell_kind::INTERPROCEDURAL_DEPTH_MARKER:
230 return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */
231 case cell_kind::INTERPROCEDURAL_POP_FRAMES_LEFT:
232 return '<';
233 case cell_kind::INTERPROCEDURAL_POP_FRAMES_MIDDLE:
234 return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */
235 case cell_kind::INTERPROCEDURAL_POP_FRAMES_RIGHT:
236 return 0x2518; /* "┘": U+2518: BOX DRAWINGS LIGHT UP AND LEFT. */
238 case cell_kind::CFG_RIGHT:
239 return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */
240 case cell_kind::CFG_FROM_RIGHT_TO_DOWN:
241 return 0x2510; /* "┐": U+2510: BOX DRAWINGS LIGHT DOWN AND LEFT */
242 case cell_kind::CFG_DOWN:
243 return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */
244 case cell_kind::CFG_FROM_DOWN_TO_LEFT:
245 return 0x2518; /* "┘": U+2518: BOX DRAWINGS LIGHT UP AND LEFT. */
246 case cell_kind::CFG_LEFT:
247 return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */
248 case cell_kind::CFG_FROM_LEFT_TO_DOWN:
249 return 0x250c; /* "┌" U+250C: BOX DRAWINGS LIGHT DOWN AND RIGHT */
250 case cell_kind::CFG_FROM_DOWN_TO_RIGHT:
251 return 0x2514; /* "└": U+2514: BOX DRAWINGS LIGHT UP AND RIGHT */
253 case cell_kind::TREE_CHILD_NON_FINAL:
254 return 0x251C; /* "├": U+251C: BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
255 case cell_kind::TREE_CHILD_FINAL:
256 return 0x2570; /* "╰": U+2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT. */
257 case cell_kind::TREE_X_CONNECTOR:
258 return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */
259 case cell_kind::TREE_Y_CONNECTOR:
260 return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */