Message ID | 20200110150547.221314-2-shawarmakarma@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/3] color.c: Refactor color_output to use enums | expand |
On Fri, Jan 10, 2020 at 10:05:46AM -0500, Eyal Soha wrote: > These colors are the bright variants of the 3-bit colors. It might be worth noting a few things we discussed. In particular: These can generally already be accessed as colors 8-15 of 256-color mode. But some terminals support these 16-color versions without supporting 256-color mode. And they're fewer bytes, which can make the output slightly more efficient. > color.c | 30 +++++++++++++++++++++++------- > t/t4026-color.sh | 8 ++++++++ > 2 files changed, 31 insertions(+), 7 deletions(-) I think we'd need a documentation change, too. These are discussed in Documentation/config.txt (search for the "color::" heading). > + int color_offset = COLOR_FOREGROUND_ANSI; > + if (strncasecmp(name, "bright", 6) == 0) { > + color_offset = COLOR_FOREGROUND_BRIGHT_ANSI; > + name += 6; > + len -= 6; > + } This drops the "+" version. I think we _could_ do both, but just having "bright" is probably fine. Having to repeat "6" isn't ideal, but we sadly don't have a case-insensitive version of skip_prefix(). We could do: static const char bright[] = "bright"; ... if (istarts_with(name, bright)) { color_offset = COLOR_FOREGROUND_BRIGHT_ANSI; name += strlen(bright); len -= strlen(bright); } but I'm not sure if it's worth it. > + for (int i = 0; i < ARRAY_SIZE(color_names); i++) { > + if (match_word(name, len, color_names[i])) { > + out->type = COLOR_ANSI; > + out->value = i + color_offset; > + return 1; > + } > + } > + return 0; > +} The 0/1 return here is unusual for our codebase. We'd usually return "0" for success and "-1" for failure. Otherwise, the patch looks good. -Peff
diff --git a/color.c b/color.c index 0549501f47..4dbf12eff8 100644 --- a/color.c +++ b/color.c @@ -29,6 +29,7 @@ enum { COLOR_FOREGROUND_ANSI = 30, COLOR_FOREGROUND_RGB = 38, COLOR_FOREGROUND_256 = 38, + COLOR_FOREGROUND_BRIGHT_ANSI = 90, }; /* Ignore the RESET at the end when giving the size */ @@ -68,13 +69,32 @@ static int get_hex_color(const char *in, unsigned char *out) return 0; } -static int parse_color(struct color *out, const char *name, int len) +static int parse_ansi_color(struct color *out, const char *name, int len) { /* Positions in array must match ANSI color codes */ static const char * const color_names[] = { "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white" }; + + int color_offset = COLOR_FOREGROUND_ANSI; + if (strncasecmp(name, "bright", 6) == 0) { + color_offset = COLOR_FOREGROUND_BRIGHT_ANSI; + name += 6; + len -= 6; + } + for (int i = 0; i < ARRAY_SIZE(color_names); i++) { + if (match_word(name, len, color_names[i])) { + out->type = COLOR_ANSI; + out->value = i + color_offset; + return 1; + } + } + return 0; +} + +static int parse_color(struct color *out, const char *name, int len) +{ char *end; int i; long val; @@ -96,12 +116,8 @@ static int parse_color(struct color *out, const char *name, int len) } /* Then pick from our human-readable color names... */ - for (i = 0; i < ARRAY_SIZE(color_names); i++) { - if (match_word(name, len, color_names[i])) { - out->type = COLOR_ANSI; - out->value = i + COLOR_FOREGROUND_ANSI; - return 0; - } + if (parse_ansi_color(out, name, len)) { + return 0; } /* And finally try a literal 256-color-mode number */ diff --git a/t/t4026-color.sh b/t/t4026-color.sh index 671e951ee5..78c69de90a 100755 --- a/t/t4026-color.sh +++ b/t/t4026-color.sh @@ -30,6 +30,14 @@ test_expect_success 'attribute before color name' ' color "bold red" "[1;31m" ' +test_expect_success 'aixterm bright fg color' ' + color "brightred" "[91m" +' + +test_expect_success 'aixterm bright bg color' ' + color "green brightblue" "[32;104m" +' + test_expect_success 'color name before attribute' ' color "red bold" "[1;31m" '
These colors are the bright variants of the 3-bit colors. Signed-off-by: Eyal Soha <shawarmakarma@gmail.com> --- color.c | 30 +++++++++++++++++++++++------- t/t4026-color.sh | 8 ++++++++ 2 files changed, 31 insertions(+), 7 deletions(-)