lineedit: fix completion with Unicode chars

function                                             old     new   delta
read_line_input                                     4966    5002     +36
bb_wcstombs                                          170     159     -11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 36/-11)             Total: 25 bytes

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
Denys Vlasenko 2010-09-02 12:03:11 +02:00
parent b068bd7a41
commit 61a36af45d
2 changed files with 14 additions and 4 deletions

View File

@ -1061,9 +1061,16 @@ static void input_tab(smallint *lastWasTab)
/* Make a local copy of the string --
* up to the position of the cursor */
#if !ENABLE_UNICODE_SUPPORT
save_string(matchBuf, cursor + 1);
#if ENABLE_UNICODE_SUPPORT
cursor_mb = strlen(matchBuf);
#else
{
CHAR_T wc = command_ps[cursor];
command_ps[cursor] = 0;
save_string(matchBuf, MAX_LINELEN);
command_ps[cursor] = wc;
cursor_mb = strlen(matchBuf);
}
#endif
tmp = matchBuf;
@ -1167,7 +1174,10 @@ static void input_tab(smallint *lastWasTab)
sprintf(&command[cursor_mb - recalc_pos], "%s%s", tmp, matchBuf);
command_len = load_string(command, S.maxsize);
/* write out the matched command */
redraw(cmdedit_y, command_len - len);
/* paranoia: load_string can return 0 on conv error,
* prevent passing len = (0 - 12) to redraw */
len = command_len - len;
redraw(cmdedit_y, len >= 0 ? len : 0);
}
}
#endif

View File

@ -131,7 +131,7 @@ size_t FAST_FUNC wcstombs(char *dest, const wchar_t *src, size_t n)
size_t len = wcrtomb_internal(tbuf, wc);
if (len > n)
len = n;
break;
memcpy(dest, tbuf, len);
if (wc == L'\0')
return org_n - n;