summaryrefslogtreecommitdiff
path: root/color.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2010-03-20 18:29:36 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-03-20 18:29:36 (GMT)
commitd7173d942ea897b67ac9ba3bab2a0cc374684ca6 (patch)
tree30470f05d89570e5d2e125feb140b4b3da630a39 /color.c
parent49559cad6cab8af548321249d320d9bb372d1859 (diff)
parent8b124135a97b593d50a90abcec231552b31c7ade (diff)
downloadgit-d7173d942ea897b67ac9ba3bab2a0cc374684ca6.zip
git-d7173d942ea897b67ac9ba3bab2a0cc374684ca6.tar.gz
git-d7173d942ea897b67ac9ba3bab2a0cc374684ca6.tar.bz2
Merge branch 'jc/color-attrs'
* 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 8f07fc9..bcf4e2c 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++)