|
@@ -5,132 +5,6 @@
|
|
|
|
|
|
int perf_use_color_default = -1;
|
|
|
|
|
|
-static int parse_color(const char *name, int len)
|
|
|
-{
|
|
|
- static const char * const color_names[] = {
|
|
|
- "normal", "black", "red", "green", "yellow",
|
|
|
- "blue", "magenta", "cyan", "white"
|
|
|
- };
|
|
|
- char *end;
|
|
|
- int i;
|
|
|
-
|
|
|
- for (i = 0; i < (int)ARRAY_SIZE(color_names); i++) {
|
|
|
- const char *str = color_names[i];
|
|
|
- if (!strncasecmp(name, str, len) && !str[len])
|
|
|
- return i - 1;
|
|
|
- }
|
|
|
- i = strtol(name, &end, 10);
|
|
|
- if (end - name == len && i >= -1 && i <= 255)
|
|
|
- return i;
|
|
|
- return -2;
|
|
|
-}
|
|
|
-
|
|
|
-static int parse_attr(const char *name, int len)
|
|
|
-{
|
|
|
- static const int attr_values[] = { 1, 2, 4, 5, 7 };
|
|
|
- static const char * const attr_names[] = {
|
|
|
- "bold", "dim", "ul", "blink", "reverse"
|
|
|
- };
|
|
|
- unsigned int i;
|
|
|
-
|
|
|
- for (i = 0; i < ARRAY_SIZE(attr_names); i++) {
|
|
|
- const char *str = attr_names[i];
|
|
|
- if (!strncasecmp(name, str, len) && !str[len])
|
|
|
- return attr_values[i];
|
|
|
- }
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
-void color_parse(const char *value, const char *var, char *dst)
|
|
|
-{
|
|
|
- color_parse_mem(value, strlen(value), var, dst);
|
|
|
-}
|
|
|
-
|
|
|
-void color_parse_mem(const char *value, int value_len, const char *var,
|
|
|
- char *dst)
|
|
|
-{
|
|
|
- const char *ptr = value;
|
|
|
- int len = value_len;
|
|
|
- int attr = -1;
|
|
|
- int fg = -2;
|
|
|
- int bg = -2;
|
|
|
-
|
|
|
- if (!strncasecmp(value, "reset", len)) {
|
|
|
- strcpy(dst, PERF_COLOR_RESET);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- /* [fg [bg]] [attr] */
|
|
|
- while (len > 0) {
|
|
|
- const char *word = ptr;
|
|
|
- int val, wordlen = 0;
|
|
|
-
|
|
|
- while (len > 0 && !isspace(word[wordlen])) {
|
|
|
- wordlen++;
|
|
|
- len--;
|
|
|
- }
|
|
|
-
|
|
|
- ptr = word + wordlen;
|
|
|
- while (len > 0 && isspace(*ptr)) {
|
|
|
- ptr++;
|
|
|
- len--;
|
|
|
- }
|
|
|
-
|
|
|
- val = parse_color(word, wordlen);
|
|
|
- if (val >= -1) {
|
|
|
- if (fg == -2) {
|
|
|
- fg = val;
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (bg == -2) {
|
|
|
- bg = val;
|
|
|
- continue;
|
|
|
- }
|
|
|
- goto bad;
|
|
|
- }
|
|
|
- val = parse_attr(word, wordlen);
|
|
|
- if (val < 0 || attr != -1)
|
|
|
- goto bad;
|
|
|
- attr = val;
|
|
|
- }
|
|
|
-
|
|
|
- if (attr >= 0 || fg >= 0 || bg >= 0) {
|
|
|
- int sep = 0;
|
|
|
-
|
|
|
- *dst++ = '\033';
|
|
|
- *dst++ = '[';
|
|
|
- if (attr >= 0) {
|
|
|
- *dst++ = '0' + attr;
|
|
|
- sep++;
|
|
|
- }
|
|
|
- if (fg >= 0) {
|
|
|
- if (sep++)
|
|
|
- *dst++ = ';';
|
|
|
- if (fg < 8) {
|
|
|
- *dst++ = '3';
|
|
|
- *dst++ = '0' + fg;
|
|
|
- } else {
|
|
|
- dst += sprintf(dst, "38;5;%d", fg);
|
|
|
- }
|
|
|
- }
|
|
|
- if (bg >= 0) {
|
|
|
- if (sep++)
|
|
|
- *dst++ = ';';
|
|
|
- if (bg < 8) {
|
|
|
- *dst++ = '4';
|
|
|
- *dst++ = '0' + bg;
|
|
|
- } else {
|
|
|
- dst += sprintf(dst, "48;5;%d", bg);
|
|
|
- }
|
|
|
- }
|
|
|
- *dst++ = 'm';
|
|
|
- }
|
|
|
- *dst = 0;
|
|
|
- return;
|
|
|
-bad:
|
|
|
- die("bad color value '%.*s' for variable '%s'", value_len, value, var);
|
|
|
-}
|
|
|
-
|
|
|
int perf_config_colorbool(const char *var, const char *value, int stdout_is_tty)
|
|
|
{
|
|
|
if (value) {
|