summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEyal Soha <shawarmakarma@gmail.com>2020-01-21 16:56:21 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-02-11 19:07:39 (GMT)
commit4a28eb0ae4fc666291a6a6f84a0605ccb9279278 (patch)
treecc53dbe9a38bb7f8ec8907a59625f54fe9b4d898
parentd0654dc308b0ba76dd8ed7bbb33c8d8f7aacd783 (diff)
downloadgit-4a28eb0ae4fc666291a6a6f84a0605ccb9279278.zip
git-4a28eb0ae4fc666291a6a6f84a0605ccb9279278.tar.gz
git-4a28eb0ae4fc666291a6a6f84a0605ccb9279278.tar.bz2
color.c: refactor color_output arguments
color_output() takes a "type" parameter, which is either '3' or '4', and that byte is shown in front of '0'-'7' to form "30"-"37" or "40"-"47" in ANSI output mode for fore-ground and back-ground colors. Clarify the purpose of the parameter by renaming it to the "background" that is a boolean. Also, change the .value field in the color struct from storing 0-7 for basic 8 colors to storing 30-37 for ANSI colors. This aligns the code to show ANSI colors to the code for the 256 color scheme, which already uses the actual value to be sent to the terminal. Signed-off-by: Eyal Soha <shawarmakarma@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--color.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/color.c b/color.c
index ebb222e..4ee690b 100644
--- a/color.c
+++ b/color.c
@@ -24,6 +24,13 @@ const char *column_colors_ansi[] = {
GIT_COLOR_RESET,
};
+enum {
+ COLOR_BACKGROUND_OFFSET = 10,
+ COLOR_FOREGROUND_ANSI = 30,
+ COLOR_FOREGROUND_RGB = 38,
+ COLOR_FOREGROUND_256 = 38,
+};
+
/* Ignore the RESET at the end when giving the size */
const int column_colors_ansi_max = ARRAY_SIZE(column_colors_ansi) - 1;
@@ -92,7 +99,7 @@ static int parse_color(struct color *out, const char *name, int len)
for (i = 0; i < ARRAY_SIZE(color_names); i++) {
if (match_word(name, len, color_names[i])) {
out->type = COLOR_ANSI;
- out->value = i;
+ out->value = i + COLOR_FOREGROUND_ANSI;
return 0;
}
}
@@ -112,7 +119,7 @@ static int parse_color(struct color *out, const char *name, int len)
/* Rewrite low numbers as more-portable standard colors. */
} else if (val < 8) {
out->type = COLOR_ANSI;
- out->value = val;
+ out->value = val + COLOR_FOREGROUND_ANSI;
return 0;
} else if (val < 256) {
out->type = COLOR_256;
@@ -166,23 +173,26 @@ int color_parse(const char *value, char *dst)
* already have the ANSI escape code in it. "out" should have enough
* space in it to fit any color.
*/
-static char *color_output(char *out, int len, const struct color *c, char type)
+static char *color_output(char *out, int len, const struct color *c, int background)
{
+ int offset = 0;
+
+ if (background)
+ offset = COLOR_BACKGROUND_OFFSET;
switch (c->type) {
case COLOR_UNSPECIFIED:
case COLOR_NORMAL:
break;
case COLOR_ANSI:
- if (len < 2)
- BUG("color parsing ran out of space");
- *out++ = type;
- *out++ = '0' + c->value;
+ out += xsnprintf(out, len, "%d", c->value + offset);
break;
case COLOR_256:
- out += xsnprintf(out, len, "%c8;5;%d", type, c->value);
+ out += xsnprintf(out, len, "%d;5;%d", COLOR_FOREGROUND_256 + offset,
+ c->value);
break;
case COLOR_RGB:
- out += xsnprintf(out, len, "%c8;2;%d;%d;%d", type,
+ out += xsnprintf(out, len, "%d;2;%d;%d;%d",
+ COLOR_FOREGROUND_RGB + offset,
c->red, c->green, c->blue);
break;
}
@@ -279,14 +289,12 @@ int color_parse_mem(const char *value, int value_len, char *dst)
if (!color_empty(&fg)) {
if (sep++)
OUT(';');
- /* foreground colors are all in the 3x range */
- dst = color_output(dst, end - dst, &fg, '3');
+ dst = color_output(dst, end - dst, &fg, 0);
}
if (!color_empty(&bg)) {
if (sep++)
OUT(';');
- /* background colors are all in the 4x range */
- dst = color_output(dst, end - dst, &bg, '4');
+ dst = color_output(dst, end - dst, &bg, 1);
}
OUT('m');
}