Hi René,

On Sun, 13 Oct 2019, René Scharfe wrote:

> Make use of utf8_strnwidth()'s feature to skip ANSI escape sequences
> instead of open-coding it.  This shortens the code and makes it more
> consistent.

Sounds good.

> This changes the behavior, though: The old code skips all kinds of
> Control Sequence Introducer sequences, while utf8_strnwidth() only skips
> the Select Graphic Rendition kind, i.e. those ending with "m".  They are
> used for specifying color and font attributes like boldness.  The only
> other kind of escape sequence we print in Git is Erase in Line, ending
> with "K".  That's not used for columnar output, so this difference
> actually doesn't matter here.

Arguably, the "Erase in Line" thing should re-set the width to 0, no?
But as you say, this is not needed for this patch.

Thanks,
Dscho

>
> Signed-off-by: René Scharfe <l....@web.de>
> ---
>  column.c | 13 +------------
>  1 file changed, 1 insertion(+), 12 deletions(-)
>
> diff --git a/column.c b/column.c
> index 7a17c14b82..4a38eed322 100644
> --- a/column.c
> +++ b/column.c
> @@ -23,18 +23,7 @@ struct column_data {
>  /* return length of 's' in letters, ANSI escapes stripped */
>  static int item_length(const char *s)
>  {
> -     int len, i = 0;
> -     struct strbuf str = STRBUF_INIT;
> -
> -     strbuf_addstr(&str, s);
> -     while ((s = strstr(str.buf + i, "\033[")) != NULL) {
> -             int len = strspn(s + 2, "0123456789;");
> -             i = s - str.buf;
> -             strbuf_remove(&str, i, len + 3); /* \033[<len><func char> */
> -     }
> -     len = utf8_strwidth(str.buf);
> -     strbuf_release(&str);
> -     return len;
> +     return utf8_strnwidth(s, -1, 1);
>  }
>
>  /*
> --
> 2.23.0
>

Reply via email to