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>
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index de70424..381203a 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1061,9 +1061,16 @@
 
 		/* 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 @@
 				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
diff --git a/libbb/unicode.c b/libbb/unicode.c
index c4b5f86..70c6abe 100644
--- a/libbb/unicode.c
+++ b/libbb/unicode.c
@@ -131,7 +131,7 @@
 		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;