From 43953bba6ff00fa78344633e4a194fe058afd8a4 Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Tue, 7 Dec 2004 21:23:39 +0000
Subject: [PATCH] store multibyte characters in dynamically allocated arrays of
 MB_CUR_MAX length, and add a few comment fixes

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2174 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 src/nano.c  | 13 +++++++++----
 src/winio.c |  5 +++--
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/nano.c b/src/nano.c
index f0517d2b..75a800fc 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -3567,14 +3567,15 @@ void do_output(int *kbinput, size_t kbinput_len)
 	/* Do we have to call edit_refresh(), or can we get away with
 	 * update_line()? */
 
-    char key[
+    char *key = charalloc(
 #ifdef NANO_WIDE
-	MB_LEN_MAX
+	MB_CUR_MAX
 #else
 	1
 #endif
-	];		/* The current character we have. */
-    int key_len;	/* The length of the current character. */
+	);		/* The current multibyte character we have. */
+    int key_len;	/* The length of the current multibyte
+			 * character. */
 
     assert(current != NULL && current->data != NULL);
 
@@ -3635,6 +3636,8 @@ void do_output(int *kbinput, size_t kbinput_len)
 #endif
 
 	{
+	    /* FIXME: The movement functions should take multibyte
+	     * characters into account. */
 	    int j;
 	    for (j = 0; j < key_len; j++)
 		do_right(FALSE);
@@ -3662,6 +3665,8 @@ void do_output(int *kbinput, size_t kbinput_len)
 #endif
     }
 
+    free(key);
+
     /* Turn constant cursor position display back on if it was on
      * before. */
     if (old_constupdate)
diff --git a/src/winio.c b/src/winio.c
index c2509032..da52d053 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -263,17 +263,18 @@ void unget_input(buffer *input, size_t input_len)
 #ifdef NANO_WIDE
     if (!ISSET(NO_UTF8)) {
 	size_t i;
+	char *key = charalloc(MB_CUR_MAX);
 
 	/* Change all invalid wide character values to -1. */
 	for (i = 0; i < input_len; i++) {
-	    char key[MB_LEN_MAX];
-
 	    if (!input[i].key_code) {
 		if (wctomb(key, input[i].key) == -1)
 		    input[i].key = -1;
 	    }
 	}
 
+	free(key);
+
 	/* Save all of the non-(-1) wide characters in another
 	 * buffer. */
 	for (i = 0; i < input_len; i++) {
-- 
GitLab