I wrote:
> In mbrtoc32:
> 
>        Return value       Consumed bytes
>        ------------       --------------
>        small n > 0        n
>        0                  1
>        (size_t)(-3)       0
> 
> The patch below thus fixes the uses of mbrtoc32.

More of the same kind:


2023-07-02  Bruno Haible  <br...@clisp.org>

        mbsrtoc32s: Accommodate a difference between mbrtowc and mbrtoc32.
        * lib/mbsrtoc32s.c (USES_C32): New macro.
        * lib/mbsrtowcs.c (USES_C32): New macro.
        * lib/mbsrtowcs-impl.h (FUNC): If USES_C32 and mbrtoc32 returned
        (size_t)(-3), don't increment the pointer.

2023-07-02  Bruno Haible  <br...@clisp.org>

        mbsnrtoc32s: Accommodate a difference between mbrtowc and mbrtoc32.
        * lib/mbsnrtoc32s.c (USES_C32): New macro.
        * lib/mbsnrtowcs.c (USES_C32): New macro.
        * lib/mbsnrtowcs-impl.h (FUNC): If USES_C32 and mbrtoc32 returned
        (size_t)(-3), don't increment the pointer.

>From 4c6f62c8240db9534250a1eee2e498ecfc3b7b3d Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sun, 2 Jul 2023 16:45:44 +0200
Subject: [PATCH 1/2] mbsnrtoc32s: Accommodate a difference between mbrtowc and
 mbrtoc32.

* lib/mbsnrtoc32s.c (USES_C32): New macro.
* lib/mbsnrtowcs.c (USES_C32): New macro.
* lib/mbsnrtowcs-impl.h (FUNC): If USES_C32 and mbrtoc32 returned
(size_t)(-3), don't increment the pointer.
---
 ChangeLog             | 8 ++++++++
 lib/mbsnrtoc32s.c     | 1 +
 lib/mbsnrtowcs-impl.h | 7 +++++--
 lib/mbsnrtowcs.c      | 1 +
 4 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 187a1abbda..3e29fc1dd1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2023-07-02  Bruno Haible  <br...@clisp.org>
+
+	mbsnrtoc32s: Accommodate a difference between mbrtowc and mbrtoc32.
+	* lib/mbsnrtoc32s.c (USES_C32): New macro.
+	* lib/mbsnrtowcs.c (USES_C32): New macro.
+	* lib/mbsnrtowcs-impl.h (FUNC): If USES_C32 and mbrtoc32 returned
+	(size_t)(-3), don't increment the pointer.
+
 2023-07-02  Bruno Haible  <br...@clisp.org>
 
 	mbmemcasecoll: Overcome wchar_t limitations.
diff --git a/lib/mbsnrtoc32s.c b/lib/mbsnrtoc32s.c
index 5baa08fd4e..788eadd99e 100644
--- a/lib/mbsnrtoc32s.c
+++ b/lib/mbsnrtoc32s.c
@@ -47,6 +47,7 @@ extern mbstate_t _gl_mbsrtoc32s_state;
 # define DCHAR_T char32_t
 # define INTERNAL_STATE _gl_mbsrtoc32s_state
 # define MBRTOWC mbrtoc32
+# define USES_C32 1
 # include "mbsnrtowcs-impl.h"
 
 #else
diff --git a/lib/mbsnrtowcs-impl.h b/lib/mbsnrtowcs-impl.h
index 7d94e24eb6..78f95a1467 100644
--- a/lib/mbsnrtowcs-impl.h
+++ b/lib/mbsnrtowcs-impl.h
@@ -61,8 +61,11 @@ FUNC (DCHAR_T *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps
                 /* Here mbsinit (ps).  */
                 break;
               }
-            src += ret;
-            srclen -= ret;
+            if (!(USES_C32 && ret == (size_t)(-3)))
+              {
+                src += ret;
+                srclen -= ret;
+              }
           }
 
         *srcp = src;
diff --git a/lib/mbsnrtowcs.c b/lib/mbsnrtowcs.c
index b5d311d292..5aa3f40ecb 100644
--- a/lib/mbsnrtowcs.c
+++ b/lib/mbsnrtowcs.c
@@ -34,4 +34,5 @@ extern mbstate_t _gl_mbsrtowcs_state;
 #define DCHAR_T wchar_t
 #define INTERNAL_STATE _gl_mbsrtowcs_state
 #define MBRTOWC mbrtowc
+#define USES_C32 0
 #include "mbsnrtowcs-impl.h"
-- 
2.34.1

>From 2864937890788e072e17b6a49de2cdc67551c780 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sun, 2 Jul 2023 16:46:11 +0200
Subject: [PATCH 2/2] mbsrtoc32s: Accommodate a difference between mbrtowc and
 mbrtoc32.

* lib/mbsrtoc32s.c (USES_C32): New macro.
* lib/mbsrtowcs.c (USES_C32): New macro.
* lib/mbsrtowcs-impl.h (FUNC): If USES_C32 and mbrtoc32 returned
(size_t)(-3), don't increment the pointer.
---
 ChangeLog            | 8 ++++++++
 lib/mbsrtoc32s.c     | 1 +
 lib/mbsrtowcs-impl.h | 3 ++-
 lib/mbsrtowcs.c      | 1 +
 4 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 3e29fc1dd1..7cd5aac216 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2023-07-02  Bruno Haible  <br...@clisp.org>
+
+	mbsrtoc32s: Accommodate a difference between mbrtowc and mbrtoc32.
+	* lib/mbsrtoc32s.c (USES_C32): New macro.
+	* lib/mbsrtowcs.c (USES_C32): New macro.
+	* lib/mbsrtowcs-impl.h (FUNC): If USES_C32 and mbrtoc32 returned
+	(size_t)(-3), don't increment the pointer.
+
 2023-07-02  Bruno Haible  <br...@clisp.org>
 
 	mbsnrtoc32s: Accommodate a difference between mbrtowc and mbrtoc32.
diff --git a/lib/mbsrtoc32s.c b/lib/mbsrtoc32s.c
index d37e67056b..92f7433818 100644
--- a/lib/mbsrtoc32s.c
+++ b/lib/mbsrtoc32s.c
@@ -39,6 +39,7 @@ extern mbstate_t _gl_mbsrtoc32s_state;
 # define DCHAR_T char32_t
 # define INTERNAL_STATE _gl_mbsrtoc32s_state
 # define MBRTOWC mbrtoc32
+# define USES_C32 1
 # include "mbsrtowcs-impl.h"
 
 #else
diff --git a/lib/mbsrtowcs-impl.h b/lib/mbsrtowcs-impl.h
index bcf729dcb9..0b068b26ab 100644
--- a/lib/mbsrtowcs-impl.h
+++ b/lib/mbsrtowcs-impl.h
@@ -61,7 +61,8 @@ FUNC (DCHAR_T *dest, const char **srcp, size_t len, mbstate_t *ps)
                 /* Here mbsinit (ps).  */
                 break;
               }
-            src += ret;
+            if (!(USES_C32 && ret == (size_t)(-3)))
+              src += ret;
           }
 
         *srcp = src;
diff --git a/lib/mbsrtowcs.c b/lib/mbsrtowcs.c
index c20fc416bd..290522ad5b 100644
--- a/lib/mbsrtowcs.c
+++ b/lib/mbsrtowcs.c
@@ -33,4 +33,5 @@ extern mbstate_t _gl_mbsrtowcs_state;
 #define DCHAR_T wchar_t
 #define INTERNAL_STATE _gl_mbsrtowcs_state
 #define MBRTOWC mbrtowc
+#define USES_C32 0
 #include "mbsrtowcs-impl.h"
-- 
2.34.1

Reply via email to