aboutsummaryrefslogtreecommitdiff
path: root/color.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2010-03-24 16:24:13 -0700
committerJunio C Hamano <gitster@pobox.com>2010-03-24 16:24:13 -0700
commit0476228de500049804ae599f557658c3f9042ad0 (patch)
tree4c9185465412afb414bdfb5688f1f804ba3d9fc4 /color.c
parentbcbbe4f9d9afa025024f18a474d11bfec32e3207 (diff)
parent8b124135a97b593d50a90abcec231552b31c7ade (diff)
downloadgit-0476228de500049804ae599f557658c3f9042ad0.tar.gz
git-0476228de500049804ae599f557658c3f9042ad0.tar.xz
Merge branch 'jc/color-attrs' into maint
* jc/color-attrs: color: allow multiple attributes
Diffstat (limited to 'color.c')
-rw-r--r--color.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/color.c b/color.c
index 62977f480..e8bcac0a7 100644
--- a/color.c
+++ b/color.c
@@ -47,7 +47,7 @@ void color_parse_mem(const char *value, int value_len, const char *var,
{
const char *ptr = value;
int len = value_len;
- int attr = -1;
+ unsigned int attr = 0;
int fg = -2;
int bg = -2;
@@ -56,7 +56,7 @@ void color_parse_mem(const char *value, int value_len, const char *var,
return;
}
- /* [fg [bg]] [attr] */
+ /* [fg [bg]] [attr]... */
while (len > 0) {
const char *word = ptr;
int val, wordlen = 0;
@@ -85,19 +85,27 @@ void color_parse_mem(const char *value, int value_len, const char *var,
goto bad;
}
val = parse_attr(word, wordlen);
- if (val < 0 || attr != -1)
+ if (0 <= val)
+ attr |= (1 << val);
+ else
goto bad;
- attr = val;
}
- if (attr >= 0 || fg >= 0 || bg >= 0) {
+ if (attr || fg >= 0 || bg >= 0) {
int sep = 0;
+ int i;
*dst++ = '\033';
*dst++ = '[';
- if (attr >= 0) {
- *dst++ = '0' + attr;
- sep++;
+
+ for (i = 0; attr; i++) {
+ unsigned bit = (1 << i);
+ if (!(attr & bit))
+ continue;
+ attr &= ~bit;
+ if (sep++)
+ *dst++ = ';';
+ *dst++ = '0' + i;
}
if (fg >= 0) {
if (sep++)