From b16923b096b7678bbaa3cc28b216049d12563528 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 22 Mar 2010 19:46:53 +0000 Subject: 27812: display invalid bytes in multibyte characters specially --- Src/Zle/zle_utils.c | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'Src/Zle/zle_utils.c') diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c index 2b2da7dcd..cc84eb8bb 100644 --- a/Src/Zle/zle_utils.c +++ b/Src/Zle/zle_utils.c @@ -120,11 +120,19 @@ zlecharasstring(ZLE_CHAR_T inchar, char *buf) size_t ret; char *ptr; - ret = wctomb(buf, inchar); - if (ret <= 0) { - /* Ick. */ - buf[0] = '?'; - return 1; +#ifdef __STDC_ISO_10646__ + if (ZSH_INVALID_WCHAR_TEST(inchar)) { + buf[0] = ZSH_INVALID_WCHAR_TO_CHAR(inchar); + ret = 1; + } else +#endif + { + ret = wctomb(buf, inchar); + if (ret <= 0) { + /* Ick. */ + buf[0] = '?'; + return 1; + } } ptr = buf + ret - 1; for (;;) { @@ -196,13 +204,20 @@ zlelineasstring(ZLE_STRING_T instr, int inll, int incs, int *outllp, for (i=0; i < inll; i++, incs--) { if (incs == 0) outcs = mb_len; - j = wcrtomb(s + mb_len, instr[i], &mbs); - if (j == -1) { - /* invalid char; what to do? */ - s[mb_len++] = ZWC('?'); - memset(&mbs, 0, sizeof(mbs)); - } else { - mb_len += j; +#ifdef __STDC_ISO_10646__ + if (ZSH_INVALID_WCHAR_TEST(instr[i])) { + s[mb_len++] = ZSH_INVALID_WCHAR_TO_CHAR(instr[i]); + } else +#endif + { + j = wcrtomb(s + mb_len, instr[i], &mbs); + if (j == -1) { + /* invalid char */ + s[mb_len++] = ZWC('?'); + memset(&mbs, 0, sizeof(mbs)); + } else { + mb_len += j; + } } } if (incs == 0) @@ -332,6 +347,13 @@ stringaszleline(char *instr, int incs, int *outll, int *outsz, int *outcs) while (ll > 0) { size_t cnt = mbrtowc(outptr, inptr, ll, &mbs); +#ifdef __STDC_ISO_10646__ + if (cnt == MB_INCOMPLETE || cnt == MB_INVALID) { + /* Use private encoding for invalid single byte */ + *outptr = ZSH_CHAR_TO_INVALID_WCHAR(*inptr); + cnt = 1; + } +#else /* * At this point we don't handle either incomplete (-2) or * invalid (-1) multibyte sequences. Use the current length @@ -339,6 +361,7 @@ stringaszleline(char *instr, int incs, int *outll, int *outsz, int *outcs) */ if (cnt == MB_INCOMPLETE || cnt == MB_INVALID) break; +#endif if (cnt == 0) { /* Converting '\0' returns 0, but a '\0' is a real -- cgit 1.4.1