This source file includes following definitions.
- parse_hex_digit
- parse_256_or_true_color_name
- tty_color_get_name_by_index
- tty_color_get_index_by_name
- tty_attr_get_bits
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include <config.h>
33
34 #include <string.h>
35
36 #include "color.h"
37 #include "color-internal.h"
38
39
40
41 gboolean mc_tty_color_disable;
42
43
44
45 #define COLOR_INTENSITY 8
46
47
48
49 typedef struct mc_tty_color_table_struct
50 {
51 const char *name;
52 int value;
53 } mc_tty_color_table_t;
54
55
56
57
58
59 static mc_tty_color_table_t const color_table[] = {
60 { "black", COLOR_BLACK },
61 { "gray", COLOR_BLACK + COLOR_INTENSITY },
62 { "red", COLOR_RED },
63 { "brightred", COLOR_RED + COLOR_INTENSITY },
64 { "green", COLOR_GREEN },
65 { "brightgreen", COLOR_GREEN + COLOR_INTENSITY },
66 { "brown", COLOR_YELLOW },
67 { "yellow", COLOR_YELLOW + COLOR_INTENSITY },
68 { "blue", COLOR_BLUE },
69 { "brightblue", COLOR_BLUE + COLOR_INTENSITY },
70 { "magenta", COLOR_MAGENTA },
71 { "brightmagenta", COLOR_MAGENTA + COLOR_INTENSITY },
72 { "cyan", COLOR_CYAN },
73 { "brightcyan", COLOR_CYAN + COLOR_INTENSITY },
74 { "lightgray", COLOR_WHITE },
75 { "white", COLOR_WHITE + COLOR_INTENSITY },
76 { "default", -1 },
77
78 { "A_REVERSE", SPEC_A_REVERSE },
79 { "A_BOLD", SPEC_A_BOLD },
80 { "A_BOLD_REVERSE", SPEC_A_BOLD_REVERSE },
81 { "A_UNDERLINE", SPEC_A_UNDERLINE },
82
83 { NULL, 0 },
84 };
85
86 static mc_tty_color_table_t const attributes_table[] = {
87 { "bold", A_BOLD },
88 #ifdef A_ITALIC
89 { "italic", A_ITALIC },
90 #endif
91 { "underline", A_UNDERLINE },
92 { "reverse", A_REVERSE },
93 { "blink", A_BLINK },
94
95 { NULL, 0 },
96 };
97
98
99
100
101
102 static inline int
103 parse_hex_digit (char c)
104 {
105 if (c >= '0' && c <= '9')
106 return c - '0';
107 c |= 0x20;
108 if (c >= 'a' && c <= 'f')
109 return c - 'a' + 10;
110 return -1;
111 }
112
113
114
115 static int
116 parse_256_or_true_color_name (const char *color_name)
117 {
118 int i;
119 char dummy;
120
121 if (sscanf (color_name, "color%d%c", &i, &dummy) == 1 && i >= 0 && i < 256)
122 {
123 return i;
124 }
125 if (sscanf (color_name, "gray%d%c", &i, &dummy) == 1 && i >= 0 && i < 24)
126 {
127 return 232 + i;
128 }
129 if (strncmp (color_name, "rgb", 3) == 0
130 && color_name[3] >= '0' && color_name[3] < '6'
131 && color_name[4] >= '0' && color_name[4] < '6'
132 && color_name[5] >= '0' && color_name[5] < '6'
133 && color_name[6] == '\0')
134 {
135 return 16 + 36 * (color_name[3] - '0') + 6 * (color_name[4] - '0') + (color_name[5] - '0');
136 }
137 if (color_name[0] == '#')
138 {
139 int len;
140
141 color_name++;
142 len = (int) strlen (color_name);
143 if (len == 3 || len == 6)
144 {
145 int h[6];
146
147 for (i = 0; i < len; i++)
148 {
149 h[i] = parse_hex_digit (color_name[i]);
150 if (h[i] == -1)
151 return -1;
152 }
153
154 if (i == 3)
155 i = (h[0] << 20) | (h[0] << 16) | (h[1] << 12) | (h[1] << 8) | (h[2] << 4) | h[2];
156 else
157 i = (h[0] << 20) | (h[1] << 16) | (h[2] << 12) | (h[3] << 8) | (h[4] << 4) | h[5];
158 return (1 << 24) | i;
159 }
160 }
161
162 return -1;
163 }
164
165
166
167
168
169 const char *
170 tty_color_get_name_by_index (int idx)
171 {
172 int i;
173
174
175
176 for (i = 0; color_table[i].name != NULL; i++)
177 if (idx == color_table[i].value)
178 return color_table[i].name;
179
180
181 if ((idx >= 16 && idx < 256) || (idx & (1 << 24)) != 0)
182 {
183 char name[9];
184
185 if (idx < 256)
186 g_snprintf (name, sizeof (name), "color%d", idx);
187 else
188 g_snprintf (name, sizeof (name), "#%06X", (unsigned int) idx & 0xFFFFFF);
189 return g_intern_string (name);
190 }
191 return "default";
192 }
193
194
195
196 int
197 tty_color_get_index_by_name (const char *color_name)
198 {
199 if (color_name != NULL)
200 {
201 size_t i;
202
203 for (i = 0; color_table[i].name != NULL; i++)
204 if (strcmp (color_name, color_table[i].name) == 0)
205 return color_table[i].value;
206 return parse_256_or_true_color_name (color_name);
207 }
208 return -1;
209 }
210
211
212
213 int
214 tty_attr_get_bits (const char *attrs)
215 {
216 int attr_bits = 0;
217
218 if (attrs != NULL)
219 {
220 gchar **attr_list;
221 int i;
222
223 attr_list = g_strsplit (attrs, "+", -1);
224
225 for (i = 0; attr_list[i] != NULL; i++)
226 {
227 int j;
228
229 for (j = 0; attributes_table[j].name != NULL; j++)
230 {
231 if (strcmp (attr_list[i], attributes_table[j].name) == 0)
232 {
233 attr_bits |= attributes_table[j].value;
234 break;
235 }
236 }
237 }
238 g_strfreev (attr_list);
239 }
240 return attr_bits;
241 }
242
243