From e3bae98aabda345983f7d7cef0b1a067322864c8 Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Mon, 18 Jul 2005 19:47:13 +0000
Subject: [PATCH] in mbstrchr(), don't count matches between valid and invalid
 multibyte sequences anymore, for consistency

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2894 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog   | 4 ++++
 src/chars.c | 5 ++++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index a6fd4b6a..db19121b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -73,6 +73,10 @@ CVS code -
 	- Make sure that the current position in the history list is
 	  properly set to the bottom if we cancel out of the prompt.
 	  New function history_reset(); changes to nanogetstr(). (DLR)
+- chars.c:
+  mbstrchr()
+	- Don't count matches between valid and invalid multibyte
+	  sequences anymore, for consistency. (DLR)
 - files.c:
   open_file()
 	- Assert that filename isn't NULL, and don't do anything special
diff --git a/src/chars.c b/src/chars.c
index 0d3a9ddf..506ad1d4 100644
--- a/src/chars.c
+++ b/src/chars.c
@@ -808,6 +808,7 @@ char *mbstrchr(const char *s, char *c)
 
 #ifdef ENABLE_UTF8
     if (ISSET(USE_UTF8)) {
+	bool bad_c_mb = FALSE, bad_s_mb = FALSE;
 	char *s_mb = charalloc(MB_CUR_MAX);
 	const char *q = s;
 	wchar_t ws, wc;
@@ -816,6 +817,7 @@ char *mbstrchr(const char *s, char *c)
 	if (c_mb_len <= 0) {
 	    mbtowc(NULL, NULL, 0);
 	    wc = (unsigned char)*c;
+	    bad_c_mb = TRUE;
 	}
 
 	while (*s != '\0') {
@@ -824,9 +826,10 @@ char *mbstrchr(const char *s, char *c)
 	    if (mbtowc(&ws, s_mb, s_mb_len) <= 0) {
 		mbtowc(NULL, NULL, 0);
 		ws = (unsigned char)*s;
+		bad_s_mb = TRUE;
 	    }
 
-	    if (ws == wc)
+	    if (bad_s_mb == bad_c_mb && ws == wc)
 		break;
 
 	    s += s_mb_len;
-- 
GitLab