From f5b571fcf7929ca6e85b3c35c4bb96db305d0b1e Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Thu, 13 Jul 2006 19:08:06 +0300 Subject: [PATCH] diff: Support 256 colors Add support for more than 8 colors. Colors can be specified as numbers -1..255. -1 is same as "normal". Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- diff.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/diff.c b/diff.c index f350c6ba9..8b4475613 100644 --- a/diff.c +++ b/diff.c @@ -26,8 +26,8 @@ enum color_diff { DIFF_FILE_NEW = 5, }; -/* "\033[1;30;47m\0" is 11 bytes */ -static char diff_colors[][16] = { +/* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */ +static char diff_colors[][24] = { "\033[m", /* reset */ "", /* normal */ "\033[1m", /* bold */ @@ -57,12 +57,16 @@ static int parse_color(const char *name, int len) "normal", "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white" }; + char *end; int i; for (i = 0; i < 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 (*name && !*end && i >= -1 && i <= 255) + return i; return -2; } @@ -135,14 +139,22 @@ static void parse_diff_color_value(const char *value, const char *var, char *dst if (fg >= 0) { if (sep++) *dst++ = ';'; - *dst++ = '3'; - *dst++ = '0' + fg; + if (fg < 8) { + *dst++ = '3'; + *dst++ = '0' + fg; + } else { + dst += sprintf(dst, "38;5;%d", fg); + } } if (bg >= 0) { if (sep++) *dst++ = ';'; - *dst++ = '4'; - *dst++ = '0' + bg; + if (bg < 8) { + *dst++ = '4'; + *dst++ = '0' + bg; + } else { + dst += sprintf(dst, "48;5;%d", bg); + } } *dst++ = 'm'; } -- 2.30.2