From f282428a4291eedc5c9428b60d05bfa83d0d9e4e Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Wed, 29 Dec 2004 21:32:22 +0000 Subject: [PATCH] handle wctomb() failures properly in display_stirng_len() and display_string() git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2207 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- src/winio.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/winio.c b/src/winio.c index dabf213d..d116b899 100644 --- a/src/winio.c +++ b/src/winio.c @@ -1769,6 +1769,8 @@ size_t display_string_len(const char *buf, size_t start_col, size_t if (bad_wide_buf_len != -1) retval += bad_wide_buf_len; + else + retval++; free(bad_wide_buf); } else { @@ -1809,7 +1811,10 @@ size_t display_string_len(const char *buf, size_t start_col, size_t free(bad_wide_buf); - retval += bad_wide_buf_len; + if (bad_wide_buf_len != -1) + retval += bad_wide_buf_len; + else + retval++; } else #endif retval += wide_buf_len; @@ -1887,10 +1892,15 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool wide_buf = control_rep((unsigned char)wide_buf); #ifdef NANO_WIDE - if (!ISSET(NO_UTF8)) + if (!ISSET(NO_UTF8)) { ctrl_wide_buf_len = wctomb(ctrl_wide_buf, (wchar_t)wide_buf); - else { + + if (ctrl_wide_buf_len == -1) { + ctrl_wide_buf_len = 1; + ctrl_wide_buf[0] = ' '; + } + } else { #endif ctrl_wide_buf_len = 1; ctrl_wide_buf[0] = (unsigned char)wide_buf; @@ -1961,10 +1971,15 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool wide_buf = control_rep((unsigned char)wide_buf); #ifdef NANO_WIDE - if (!ISSET(NO_UTF8)) + if (!ISSET(NO_UTF8)) { ctrl_wide_buf_len = wctomb(ctrl_wide_buf, (wchar_t)wide_buf); - else { + + if (ctrl_wide_buf_len == -1) { + ctrl_wide_buf_len = 1; + ctrl_wide_buf[0] = ' '; + } + } else { #endif ctrl_wide_buf_len = 1; ctrl_wide_buf[0] = (unsigned char)wide_buf; @@ -2003,6 +2018,11 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool bad_wide_buf_len = wctomb(bad_wide_buf, (wchar_t)wide_buf); + if (bad_wide_buf_len == -1) { + bad_wide_buf_len = 1; + bad_wide_buf[0] = ' '; + } + for (i = 0; i < bad_wide_buf_len; i++) converted[index++] = bad_wide_buf[i];