mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-18 21:14:11 +01:00
Changed mb_niceformat() so that it does not truncate a name that
has an invalid character sequence in the current character set, displaying them as \M-... chars. (Improved version of the patch from workers/22140.)
This commit is contained in:
parent
37c458aa8c
commit
97c34b631c
29
Src/utils.c
29
Src/utils.c
@ -3473,24 +3473,23 @@ mb_niceformat(const char *s, FILE *stream, char **outstrp, int heap)
|
||||
while (umlen > 0) {
|
||||
ret = mbrtowc(&c, ptr, umlen, &ps);
|
||||
|
||||
if (ret == (size_t)-1 || ret == (size_t)-2)
|
||||
{
|
||||
/*
|
||||
* We're a bit stuck here. I suppose we could
|
||||
* just stick with \M-... for the individual bytes.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* careful in case converting NULL returned 0: NULLs are real
|
||||
* characters for us.
|
||||
*/
|
||||
if (c == L'\0' && ret == 0)
|
||||
if (ret != (size_t)-1 && ret != (size_t)-2) {
|
||||
/* Careful: converting '\0' returns 0, but a '\0' is a
|
||||
* real character for us, so we should consume 1 byte. */
|
||||
if (c == L'\0')
|
||||
ret = 1;
|
||||
fmt = wcs_nicechar(c, &newl, NULL);
|
||||
} else {
|
||||
/* The byte didn't convert, so output it as a \M-... sequence. */
|
||||
fmt = nicechar(STOUC(*ptr));
|
||||
newl = strlen(fmt);
|
||||
ret = 1;
|
||||
/* Get ps out of its undefined state. */
|
||||
memset(&ps, 0, sizeof ps);
|
||||
}
|
||||
|
||||
umlen -= ret;
|
||||
ptr += ret;
|
||||
|
||||
fmt = wcs_nicechar(c, &newl, NULL);
|
||||
l += newl;
|
||||
|
||||
if (stream)
|
||||
|
Loading…
Reference in New Issue
Block a user