зеркало из https://github.com/microsoft/git.git
color.c: support bright aixterm colors
These colors are the bright variants of the 3-bit colors. Instead of 30-37 range for the foreground and 40-47 range for the background, they live in 90-97 and 100-107 range, respectively. Signed-off-by: Eyal Soha <shawarmakarma@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
4a28eb0ae4
Коммит
1751b09a92
|
@ -263,7 +263,9 @@ color::
|
||||||
+
|
+
|
||||||
The basic colors accepted are `normal`, `black`, `red`, `green`, `yellow`,
|
The basic colors accepted are `normal`, `black`, `red`, `green`, `yellow`,
|
||||||
`blue`, `magenta`, `cyan` and `white`. The first color given is the
|
`blue`, `magenta`, `cyan` and `white`. The first color given is the
|
||||||
foreground; the second is the background.
|
foreground; the second is the background. All the basic colors except
|
||||||
|
`normal` have a bright variant that can be speficied by prefixing the
|
||||||
|
color with `bright`, like `brightred`.
|
||||||
+
|
+
|
||||||
Colors may also be given as numbers between 0 and 255; these use ANSI
|
Colors may also be given as numbers between 0 and 255; these use ANSI
|
||||||
256-color mode (but note that not all terminals may support this). If
|
256-color mode (but note that not all terminals may support this). If
|
||||||
|
|
36
color.c
36
color.c
|
@ -29,6 +29,7 @@ enum {
|
||||||
COLOR_FOREGROUND_ANSI = 30,
|
COLOR_FOREGROUND_ANSI = 30,
|
||||||
COLOR_FOREGROUND_RGB = 38,
|
COLOR_FOREGROUND_RGB = 38,
|
||||||
COLOR_FOREGROUND_256 = 38,
|
COLOR_FOREGROUND_256 = 38,
|
||||||
|
COLOR_FOREGROUND_BRIGHT_ANSI = 90,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Ignore the RESET at the end when giving the size */
|
/* Ignore the RESET at the end when giving the size */
|
||||||
|
@ -68,15 +69,38 @@ static int get_hex_color(const char *in, unsigned char *out)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_color(struct color *out, const char *name, int len)
|
/*
|
||||||
|
* If an ANSI color is recognized in "name", fill "out" and return 0.
|
||||||
|
* Otherwise, leave out unchanged and return -1.
|
||||||
|
*/
|
||||||
|
static int parse_ansi_color(struct color *out, const char *name, int len)
|
||||||
{
|
{
|
||||||
/* Positions in array must match ANSI color codes */
|
/* Positions in array must match ANSI color codes */
|
||||||
static const char * const color_names[] = {
|
static const char * const color_names[] = {
|
||||||
"black", "red", "green", "yellow",
|
"black", "red", "green", "yellow",
|
||||||
"blue", "magenta", "cyan", "white"
|
"blue", "magenta", "cyan", "white"
|
||||||
};
|
};
|
||||||
char *end;
|
|
||||||
int i;
|
int i;
|
||||||
|
int color_offset = COLOR_FOREGROUND_ANSI;
|
||||||
|
|
||||||
|
if (strncasecmp(name, "bright", 6) == 0) {
|
||||||
|
color_offset = COLOR_FOREGROUND_BRIGHT_ANSI;
|
||||||
|
name += 6;
|
||||||
|
len -= 6;
|
||||||
|
}
|
||||||
|
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_offset;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_color(struct color *out, const char *name, int len)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
long val;
|
long val;
|
||||||
|
|
||||||
/* First try the special word "normal"... */
|
/* First try the special word "normal"... */
|
||||||
|
@ -96,12 +120,8 @@ static int parse_color(struct color *out, const char *name, int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then pick from our human-readable color names... */
|
/* Then pick from our human-readable color names... */
|
||||||
for (i = 0; i < ARRAY_SIZE(color_names); i++) {
|
if (parse_ansi_color(out, name, len) == 0) {
|
||||||
if (match_word(name, len, color_names[i])) {
|
return 0;
|
||||||
out->type = COLOR_ANSI;
|
|
||||||
out->value = i + COLOR_FOREGROUND_ANSI;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* And finally try a literal 256-color-mode number */
|
/* And finally try a literal 256-color-mode number */
|
||||||
|
|
|
@ -30,6 +30,14 @@ test_expect_success 'attribute before color name' '
|
||||||
color "bold red" "[1;31m"
|
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' '
|
test_expect_success 'color name before attribute' '
|
||||||
color "red bold" "[1;31m"
|
color "red bold" "[1;31m"
|
||||||
'
|
'
|
||||||
|
|
Загрузка…
Ссылка в новой задаче