diff options
author | René Scharfe <rene.scharfe@lsrfire.ath.cx> | 2009-11-23 23:40:03 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-11-23 15:36:07 -0800 |
commit | 8a3c63e01d2b1df471beafff5fb78df4bade9388 (patch) | |
tree | b2e90f32aef65155545226b454eb9cf4ee63879f /utf8.c | |
parent | 3288f20171ce6aee5d9d51d111ee17cd4b426af4 (diff) | |
download | git-8a3c63e01d2b1df471beafff5fb78df4bade9388.tar.gz |
strbuf_add_wrapped_text(): skip over colour codes
Ignore display mode escape sequences (colour codes) for the purpose of
text wrapping because they don't have a visible width.
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'utf8.c')
-rw-r--r-- | utf8.c | 22 |
1 files changed, 21 insertions, 1 deletions
@@ -314,6 +314,20 @@ static void strbuf_add_indented_text(struct strbuf *buf, const char *text, } } +static size_t display_mode_esc_sequence_len(const char *s) +{ + const char *p = s; + if (*p++ != '\033') + return 0; + if (*p++ != '[') + return 0; + while (isdigit(*p) || *p == ';') + p++; + if (*p++ != 'm') + return 0; + return p - s; +} + /* * Wrap the text, if necessary. The variable indent is the indent for the * first line, indent2 is the indent for all other lines. @@ -337,7 +351,13 @@ int strbuf_add_wrapped_text(struct strbuf *buf, } for (;;) { - char c = *text; + char c; + size_t skip; + + while ((skip = display_mode_esc_sequence_len(text))) + text += skip; + + c = *text; if (!c || isspace(c)) { if (w < width || !space) { const char *start = bol; |