Nguyễn Thái Ngọc Duy <[email protected]> writes:
> When utf8_width(&src) is called with *src == NULL (because the
> source string ends with an ansi sequence),
I am not sure what you mean by "because" here. Do you mean somebody
(who?) decides to call the utf8_width() with NULL pointer stored in
*src because of "ansi sequence"?
What do you mean by "ansi sequence"? I'll assume that you mean
those terminal control that all use bytes with hi-bit clear.
At the very beginning of utf8_width(), *start can be cleared to
point at a NULL pointer by pick_one_utf8_char() if the pointer that
comes into utf8_width() originally points at an invalid UTF-8
string, but as far as I can see, ESC (or any bytes that would be
used in those terminal control sequences like colors and cursor
control) will simply be returned as a single byte, without going
into error path that clears *start = NULL.
Puzzled...
> it returns 0 and steps
> 'src' by one.
Here "it" refers to utf8_width()? Who steps 'src' by one?
Ahh, did you mean *src == NUL, i.e. "already at the end of the
string"?
I think utf8_width() called with an empty string should not move the
pointer past that end-of-string NUL in the first place. It makes me
wonder if it would be a better fix to make it not to do that (and
return 0), but if we declare it is the caller's fault, perhaps we
may want to add
if (!**start)
die("BUG: empty string to utf8_width()???");
at the very beginning of utf8_width(), even before it calls
pick-one-utf8-char.
Still puzzled...
> This stepping makes strbuf_utf8_replace add NUL to the
> destination string at the end of the loop. Check and break the loop
> early.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
> ---
> utf8.c | 2 ++
> 1 file changed, 2 insertions(+)
Tests?
> diff --git a/utf8.c b/utf8.c
> index b30790d..cd090a1 100644
> --- a/utf8.c
> +++ b/utf8.c
> @@ -381,6 +381,8 @@ void strbuf_utf8_replace(struct strbuf *sb_src, int pos,
> int width,
> src += n;
> dst += n;
> }
> + if (src >= end)
> + break;
>
> old = src;
> n = utf8_width((const char**)&src, NULL);
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html