From: Bruno Haible <bruno@clisp.org>
Date: Fri, 30 Jun 2023 20:48:12 +0000 (+0200)
Subject: Accommodate a difference between mbrtowc and mbrtoc32.
X-Git-Tag: v1.0~1164
X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=2dfd7cc0f336098fd96e1e7b010270fe91ac4e95;p=gnulib.git

Accommodate a difference between mbrtowc and mbrtoc32.

* lib/mbiter.h (mbiter_multi_next): Handle the mbrtoc32 return value
(size_t)(-3).
* lib/mbuiter.h (mbuiter_multi_next): Likewise.
* lib/mbfile.h (mbfile_multi_getc): Likewise.
---

diff --git a/ChangeLog b/ChangeLog
index 5c2ea3039c..ead993b18d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2023-06-30  Bruno Haible  <bruno@clisp.org>
+
+	Accommodate a difference between mbrtowc and mbrtoc32.
+	* lib/mbiter.h (mbiter_multi_next): Handle the mbrtoc32 return value
+	(size_t)(-3).
+	* lib/mbuiter.h (mbuiter_multi_next): Likewise.
+	* lib/mbfile.h (mbfile_multi_getc): Likewise.
+
 2023-06-30  Bruno Haible  <bruno@clisp.org>
 
 	doc: Reference some reported bugs (in comments).
diff --git a/lib/mbfile.h b/lib/mbfile.h
index 7c6d70fcae..716ab3fc89 100644
--- a/lib/mbfile.h
+++ b/lib/mbfile.h
@@ -183,6 +183,10 @@ mbfile_multi_getc (struct mbchar *mbc, struct mbfile_multi *mbf)
               assert (mbf->buf[0] == '\0');
               assert (mbc->wc == 0);
             }
+          else if (bytes == (size_t) -3)
+            /* The previous multibyte sequence produced an additional 32-bit
+               wide character.  */
+            bytes = 0;
           mbc->wc_valid = true;
           break;
         }
diff --git a/lib/mbiter.h b/lib/mbiter.h
index 93bad990a1..fadefe104b 100644
--- a/lib/mbiter.h
+++ b/lib/mbiter.h
@@ -163,6 +163,10 @@ mbiter_multi_next (struct mbiter_multi *iter)
               assert (*iter->cur.ptr == '\0');
               assert (iter->cur.wc == 0);
             }
+          else if (iter->cur.bytes == (size_t) -3)
+            /* The previous multibyte sequence produced an additional 32-bit
+               wide character.  */
+            iter->cur.bytes = 0;
           iter->cur.wc_valid = true;
 
           /* When in the initial state, we can go back treating ASCII
diff --git a/lib/mbuiter.h b/lib/mbuiter.h
index 02e3190f1c..954e11f635 100644
--- a/lib/mbuiter.h
+++ b/lib/mbuiter.h
@@ -172,6 +172,10 @@ mbuiter_multi_next (struct mbuiter_multi *iter)
               assert (*iter->cur.ptr == '\0');
               assert (iter->cur.wc == 0);
             }
+          else if (iter->cur.bytes == (size_t) -3)
+            /* The previous multibyte sequence produced an additional 32-bit
+               wide character.  */
+            iter->cur.bytes = 0;
           iter->cur.wc_valid = true;
 
           /* When in the initial state, we can go back treating ASCII