1
0
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:
Wayne Davison 2006-01-08 22:57:05 +00:00
parent 37c458aa8c
commit 97c34b631c

@ -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)