From 7f09a15a83ab868ece1b222cbab71d1456a413e2 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 12 Aug 2005 10:24:23 +0000 Subject: 21603: wchar/multibyte conversion of cursor position when at end of line --- Src/Zle/zle_utils.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'Src/Zle/zle_utils.c') diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c index f8c4d2013..2e358f489 100644 --- a/Src/Zle/zle_utils.c +++ b/Src/Zle/zle_utils.c @@ -140,16 +140,19 @@ zlelineasstring(ZLE_STRING_T instr, int inll, int incs, int *outllp, s = zalloc(inll * MB_CUR_MAX + 1); outcs = 0; - for(i=0; i < inll; i++, incs--) { + for (i=0; i < inll; i++, incs--) { if (incs == 0) outcs = mb_len; j = wctomb(s + mb_len, instr[i]); if (j == -1) { /* invalid char; what to do? */ + s[mb_len++] = ZWC('?'); } else { mb_len += j; } } + if (incs == 0) + outcs = mb_len; s[mb_len] = '\0'; outll = mb_len; @@ -279,7 +282,7 @@ stringaszleline(unsigned char *instr, int incs, /* Reset shift state to input complete string */ memset(&ps, '\0', sizeof(ps)); - while (ll) { + while (ll > 0) { size_t ret = mbrtowc(outptr, inptr, ll, &ps); /* @@ -311,6 +314,8 @@ stringaszleline(unsigned char *instr, int incs, outptr++; ll -= ret; } + if (outcs && inptr <= (char *)instr + incs) + *outcs = outptr - outstr; *outll = outptr - outstr; } else { *outll = 0; -- cgit v1.2.3