2 * No copyright is claimed. This code is in the public domain; do with
5 * Copyright (C) 2012-2015 Karel Zak <kzak@redhat.com>
8 #include "color-names.h"
12 struct ul_color_name
{
20 static int cmp_color_name(const void *a0
, const void *b0
)
22 const struct ul_color_name
23 *a
= (const struct ul_color_name
*) a0
,
24 *b
= (const struct ul_color_name
*) b0
;
25 return strcmp(a
->name
, b
->name
);
29 * Maintains human readable color names
31 const char *color_sequence_from_colorname(const char *str
)
33 static const struct ul_color_name basic_schemes
[] = {
34 { "black", UL_COLOR_BLACK
},
35 { "blink", UL_COLOR_BLINK
},
36 { "blue", UL_COLOR_BLUE
},
37 { "bold", UL_COLOR_BOLD
},
38 { "brown", UL_COLOR_BROWN
},
39 { "cyan", UL_COLOR_CYAN
},
40 { "darkgray", UL_COLOR_DARK_GRAY
},
41 { "gray", UL_COLOR_GRAY
},
42 { "green", UL_COLOR_GREEN
},
43 { "halfbright", UL_COLOR_HALFBRIGHT
},
44 { "lightblue", UL_COLOR_BOLD_BLUE
},
45 { "lightcyan", UL_COLOR_BOLD_CYAN
},
46 { "lightgray,", UL_COLOR_GRAY
},
47 { "lightgreen", UL_COLOR_BOLD_GREEN
},
48 { "lightmagenta", UL_COLOR_BOLD_MAGENTA
},
49 { "lightred", UL_COLOR_BOLD_RED
},
50 { "magenta", UL_COLOR_MAGENTA
},
51 { "red", UL_COLOR_RED
},
52 { "reset", UL_COLOR_RESET
, },
53 { "reverse", UL_COLOR_REVERSE
},
54 { "yellow", UL_COLOR_BOLD_YELLOW
},
55 { "white", UL_COLOR_WHITE
}
57 struct ul_color_name key
= { .name
= str
}, *res
;
62 res
= bsearch(&key
, basic_schemes
, ARRAY_SIZE(basic_schemes
),
63 sizeof(struct ul_color_name
),
65 return res
? res
->seq
: NULL
;
69 int color_is_sequence(const char *color
)
71 if (color
&& *color
== 0x1B) {
72 size_t len
= strlen(color
);
75 *(color
+ 1) == '[' &&
76 isdigit(*(color
+ 2)) &&
77 *(color
+ len
- 1) == 'm')
84 /* canonicalize sequence */
85 static int __color_canonicalize(const char *str
, char **seq
)
95 /* convert color names like "red" to the real sequence */
96 if (*str
!= '\\' && isalpha(*str
)) {
97 const char *s
= color_sequence_from_colorname(str
);
98 *seq
= strdup(s
? s
: str
);
100 return *seq
? 0 : -ENOMEM
;
103 /* convert xx;yy sequences to "\033[xx;yy" */
104 if ((len
= asprintf(seq
, "\033[%sm", str
)) < 1)
107 for (in
= *seq
, out
= *seq
; in
&& *in
; in
++) {
114 *out
++ = '\a'; /* Bell */
117 *out
++ = '\b'; /* Backspace */
120 *out
++ = '\033'; /* Escape */
123 *out
++ = '\f'; /* Form Feed */
126 *out
++ = '\n'; /* Newline */
129 *out
++ = '\r'; /* Carriage Return */
132 *out
++ = '\t'; /* Tab */
135 *out
++ = '\v'; /* Vertical Tab */
138 *out
++ = '\\'; /* Backslash */
141 *out
++ = ' '; /* Space */
144 *out
++ = '#'; /* Hash mark */
147 *out
++ = '?'; /* Question mark */
158 assert ((out
- *seq
) <= len
);
165 char *color_get_sequence(const char *color
)
168 int rc
= __color_canonicalize(color
, &seq
);
170 return rc
? NULL
: seq
;