From 3f9c63589ea9e08a93d6f65f8a34e040cb13320e Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Tue, 25 Jan 2005 19:21:11 +0000
Subject: [PATCH] turn string functions that don't take length arguments into
 wrappers for the versions that take length arguments, add multibyte
 equivalent of strlen(), and fix potential segfault in mbstrnlen()

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2300 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog   | 33 ++++++++++++------------
 src/chars.c | 74 ++++++++++++-----------------------------------------
 src/proto.h |  1 +
 3 files changed, 35 insertions(+), 73 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d3fd88dd..46cdd321 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -97,22 +97,23 @@ CVS code -
 	  is_alnum_mbchar(), is_alnum_wchar(), is_blank_mbchar(),
 	  is_blank_wchar(), is_cntrl_mbchar(), is_cntrl_wchar(),
 	  control_mbrep(), control_wrep(), mbwidth(), mb_cur_max(),
-	  make_mbchar(), mbstrnlen(), mbstrcasecmp(), mbstrncasecmp(),
-	  mbstrcasestr(), and mbrevstrcasestr(); changes to is_byte()
-	  (moved to chars.c), is_blank_char() (moved to chars.c),
-	  is_cntrl_char() (moved to chars.c), nstricmp() (renamed
-	  nstrcasecmp() and moved to chars.c), nstrnicmp() (renamed
-	  nstrncasecmp() and moved to chars.c), nstristr() (renamed
-	  nstrcasestr() and moved to chars.c), revstrstr() (moved to
-	  chars.c), revstristr() (renamed revstrcasestr() and moved to
-	  chars.c), nstrnlen() (moved to chars.c), parse_char()
-	  (renamed parse_mbchar() and moved to chars.c), move_left()
-	  (renamed move_mbleft() and moved to chars.c), move_right()
-	  (renamed move_mbright() and moved to chars.c), do_home(),
-	  do_verbatim_input(), do_delete(), do_tab(), do_next_word(),
-	  do_prev_word(), do_input(), do_output(), strstrwrapper(),
-	  get_buffer(), unget_input(), unget_kbinput(), get_input(),
-	  parse_kbinput(), unparse_kbinput(), parse_verbatim_kbinput(),
+	  make_mbchar(), mbstrlen(), mbstrnlen(), mbstrcasecmp(),
+	  mbstrncasecmp(), mbstrcasestr(), and mbrevstrcasestr();
+	  changes to is_byte() (moved to chars.c), is_blank_char()
+	  (moved to chars.c), is_cntrl_char() (moved to chars.c),
+	  nstricmp() (renamed nstrcasecmp() and moved to chars.c),
+	  nstrnicmp() (renamed nstrncasecmp() and moved to chars.c),
+	  nstristr() (renamed nstrcasestr() and moved to chars.c),
+	  revstrstr() (moved to chars.c), revstristr() (renamed
+	  revstrcasestr() and moved to chars.c), nstrnlen() (moved to
+	  chars.c), parse_char() (renamed parse_mbchar() and moved to
+	  chars.c), move_left() (renamed move_mbleft() and moved to
+	  chars.c), move_right() (renamed move_mbright() and moved to
+	  chars.c), do_home(), do_verbatim_input(), do_delete(),
+	  do_tab(), do_next_word(), do_prev_word(), do_input(),
+	  do_output(), strstrwrapper(), get_buffer(), unget_input(),
+	  unget_kbinput(), get_input(), parse_kbinput(),
+	  unparse_kbinput(), parse_verbatim_kbinput(),
 	  do_statusbar_input(), do_statusbar_home(),
 	  do_statusbar_verbatim_kbinput(), do_statusbar_output(), and
 	  display_string(); removal of buffer_to_keys() and
diff --git a/src/chars.c b/src/chars.c
index 8ba6d95d..356ecc50 100644
--- a/src/chars.c
+++ b/src/chars.c
@@ -436,66 +436,19 @@ size_t move_mbright(const char *buf, size_t pos)
 /* This function is equivalent to strcasecmp(). */
 int nstrcasecmp(const char *s1, const char *s2)
 {
-    assert(s1 != NULL && s2 != NULL);
-
-    for (; *s1 != '\0' && *s2 != '\0'; s1++, s2++) {
-	if (tolower(*s1) != tolower(*s2))
-	    break;
-    }
-
-    return (tolower(*s1) - tolower(*s2));
+    return
+#ifdef HAVE_STRNCASECMP
+	strncasecmp(s1, s2, (size_t)-1);
+#else
+	nstrncasecmp(s1, s2, (size_t)-1);
+#endif
 }
 #endif
 
 /* This function is equivalent to strcasecmp() for multibyte strings. */
 int mbstrcasecmp(const char *s1, const char *s2)
 {
-#ifdef NANO_WIDE
-    if (!ISSET(NO_UTF8)) {
-	char *s1_mb = charalloc(MB_CUR_MAX);
-	char *s2_mb = charalloc(MB_CUR_MAX);
-	wchar_t ws1, ws2;
-
-	assert(s1 != NULL && s2 != NULL);
-
-	while (*s1 != '\0' && *s2 != '\0') {
-	    int s1_mb_len, s2_mb_len;
-
-	    s1_mb_len = parse_mbchar(s1, s1_mb, NULL, NULL);
-
-	    if (mbtowc(&ws1, s1_mb, s1_mb_len) <= 0) {
-		mbtowc(NULL, NULL, 0);
-		ws1 = (unsigned char)*s1_mb;
-	    }
-
-
-	    s2_mb_len = parse_mbchar(s2, s2_mb, NULL, NULL);
-
-	    if (mbtowc(&ws2, s2_mb, s2_mb_len) <= 0) {
-		mbtowc(NULL, NULL, 0);
-		ws2 = (unsigned char)*s2_mb;
-	    }
-
-
-	    if (towlower(ws1) != towlower(ws2))
-		break;
-
-	    s1 += s1_mb_len;
-	    s2 += s2_mb_len;
-	}
-
-	free(s1_mb);
-	free(s2_mb);
-
-	return (towlower(ws1) - towlower(ws2));
-    } else
-#endif
-	return
-#ifdef HAVE_STRCASECMP
-		strcasecmp(s1, s2);
-#else
-		nstrcasecmp(s1, s2);
-#endif
+    return mbstrncasecmp(s1, s2, (size_t)-1);
 }
 
 #ifndef HAVE_STRNCASECMP
@@ -752,6 +705,12 @@ const char *mbrevstrcasestr(const char *haystack, const char *needle,
 }
 #endif
 
+/* This function is equivalent to strlen() for multibyte strings. */
+size_t mbstrlen(const char *s)
+{
+    return mbstrnlen(s, (size_t)-1);
+}
+
 #ifndef HAVE_STRNLEN
 /* This function is equivalent to strnlen(). */
 size_t nstrnlen(const char *s, size_t maxlen)
@@ -779,18 +738,19 @@ size_t mbstrnlen(const char *s, size_t maxlen)
 	int s_mb_len;
 
 	while (*s != '\0') {
-	    s_mb_len = parse_mbchar(s + n, s_mb, NULL, NULL);
+	    s_mb_len = parse_mbchar(s, s_mb, NULL, NULL);
 
 	    if (maxlen == 0)
 		break;
 
 	    maxlen--;
-	    n += s_mb_len;
+	    s += s_mb_len;
+	    n++;
 	}
 
 	free(s_mb);
 
-	return strnlenpt(s, n);
+	return n;
     } else
 #endif
 	return
diff --git a/src/proto.h b/src/proto.h
index 668d1002..605396ec 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -202,6 +202,7 @@ const char *revstrcasestr(const char *haystack, const char *needle,
 const char *mbrevstrcasestr(const char *haystack, const char *needle,
 	const char *rev_start);
 #endif
+size_t mbstrlen(const char *s);
 #ifndef HAVE_STRNLEN
 size_t nstrnlen(const char *s, size_t maxlen);
 #endif
-- 
GitLab