From 956da0d0e12f470b1cb7f04e02380ecb0d54eb4e Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Mon, 3 Jan 2005 06:56:38 +0000 Subject: [PATCH] miscellaneous fixes: skip over invalid wide characters, and if wcwidth() returns -1, don't add its value to any column counter; also update another copyright year git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2219 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- src/utils.c | 18 +++++++++++----- src/winio.c | 60 +++++++++++++++++++++++++++-------------------------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/utils.c b/src/utils.c index 4e8c4280..8fd71186 100644 --- a/src/utils.c +++ b/src/utils.c @@ -2,7 +2,7 @@ /************************************************************************** * utils.c * * * - * Copyright (C) 1999-2004 Chris Allegretta * + * Copyright (C) 1999-2005 Chris Allegretta * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2, or (at your option) * @@ -188,16 +188,24 @@ int parse_char(const char *str, int *chr, size_t *col (*col)++; wide_str = control_rep((unsigned char)wide_str); - if (wctomb(ctrl_wide_str, (wchar_t)wide_str) != -1) - *col += wcwidth(wide_str); + if (wctomb(ctrl_wide_str, (wchar_t)wide_str) != -1) { + int width = wcwidth(wide_str); + + if (width != -1) + *col += width; + } else (*col)++; free(ctrl_wide_str); /* If we have a normal character, get its width in columns * normally. */ - } else - *col += wcwidth(wide_str); + } else { + int width = wcwidth(wide_str); + + if (width != -1) + *col += width; + } } } else { #endif diff --git a/src/winio.c b/src/winio.c index 0c5cf624..1378d3a5 100644 --- a/src/winio.c +++ b/src/winio.c @@ -2119,8 +2119,6 @@ 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 { @@ -2242,15 +2240,10 @@ 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); - - if (ctrl_wide_buf_len == -1) { - ctrl_wide_buf_len = 1; - ctrl_wide_buf[0] = ' '; - } - } else { + else { #endif ctrl_wide_buf_len = 1; ctrl_wide_buf[0] = (unsigned char)wide_buf; @@ -2263,10 +2256,21 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool free(ctrl_wide_buf); - start_col++; +#ifdef NANO_WIDE + if (!ISSET(NO_UTF8)) { + int width = wcwidth((wchar_t)wide_buf); + + if (width != -1) + start_col += width; + } else +#endif + start_col++; + start_index += wide_buf_len; } - } else if (wcwidth(wide_buf) > 1) { + } +#ifdef NANO_WIDE + else if (wcwidth((wchar_t)wide_buf) > 1) { /* If dollars is TRUE, make room for the "$" at the * beginning of the line. Also make sure that we don't try * to display only part of a multicolumn character there. */ @@ -2280,6 +2284,7 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool start_col++; start_index += wide_buf_len; } +#endif } while (index < alloc_len && buf[start_index] != '\0') { @@ -2321,15 +2326,10 @@ 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); - - if (ctrl_wide_buf_len == -1) { - ctrl_wide_buf_len = 1; - ctrl_wide_buf[0] = ' '; - } - } else { + else { #endif ctrl_wide_buf_len = 1; ctrl_wide_buf[0] = (unsigned char)wide_buf; @@ -2342,11 +2342,15 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool free(ctrl_wide_buf); - start_col += #ifdef NANO_WIDE - !ISSET(NO_UTF8) ? wcwidth((wchar_t)wide_buf) : + if (!ISSET(NO_UTF8)) { + int width = wcwidth((wchar_t)wide_buf); + + if (width != -1) + start_col += width; + } else #endif - 1; + start_col++; } else if (wide_buf == ' ') { converted[index++] = #if !defined(NANO_SMALL) && defined(ENABLE_NANORC) @@ -2368,11 +2372,6 @@ 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]; @@ -2384,9 +2383,12 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool #ifdef NANO_WIDE } - if (!ISSET(NO_UTF8)) - start_col += wcwidth((wchar_t)wide_buf); - else + if (!ISSET(NO_UTF8)) { + int width = wcwidth((wchar_t)wide_buf); + + if (width != -1) + start_col += width; + } else #endif start_col++; }