]> Savannah Git Hosting - gnulib.git/commitdiff
mbrtowc: port better to narrow-wchar_t platforms
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 26 Dec 2019 08:50:12 +0000 (00:50 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 26 Dec 2019 08:50:49 +0000 (00:50 -0800)
* lib/mbrtowc.c (mbrtowc): On platforms like AIX 7.2, where
wchar_t is too narrow to represent all the Unicode characters,
consider a byte sequence for an out-of-wchar_t-range character to
be an encoding error.  This fixes grep’s surrogate-pair test
failure on AIX 7.2.

ChangeLog
lib/mbrtowc.c

index 40f74abdde62671569dbd4d507e3aab5275e502e..70b46625fa71fda3aa5bd47d12d5d880eadd48a1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2019-12-26  Paul Eggert  <eggert@cs.ucla.edu>
+
+       mbrtowc: port better to narrow-wchar_t platforms
+       * lib/mbrtowc.c (mbrtowc): On platforms like AIX 7.2, where
+       wchar_t is too narrow to represent all the Unicode characters,
+       consider a byte sequence for an out-of-wchar_t-range character to
+       be an encoding error.  This fixes grep’s surrogate-pair test
+       failure on AIX 7.2.
+
 2019-12-24  Bruno Haible  <bruno@clisp.org>
 
        localcharset: Avoid referencing rpl_setlocale on native Windows.
index 1aad22cd5a5a9f9201dcf29ef75d8c4212f2eeff..38301dfbaea8e9d7bb07879791d6796e7e11008b 100644 (file)
@@ -214,12 +214,17 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
 
                             if ((c3 ^ 0x80) < 0x40)
                               {
-                                if (pwc != NULL)
-                                  *pwc = ((unsigned int) (c & 0x0f) << 12)
-                                         | ((unsigned int) (c2 ^ 0x80) << 6)
-                                         | (unsigned int) (c3 ^ 0x80);
-                                res = 3;
-                                goto success;
+                                unsigned int wc
+                                  = (((unsigned int) (c & 0x0f) << 12)
+                                     | ((unsigned int) (c2 ^ 0x80) << 6)
+                                     | (unsigned int) (c3 ^ 0x80));
+                                if (wc <= WCHAR_MAX)
+                                  {
+                                    if (pwc != NULL)
+                                      *pwc = wc;
+                                    res = 3;
+                                    goto success;
+                                  }
                               }
                           }
                       }
@@ -253,13 +258,19 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
 
                                     if ((c4 ^ 0x80) < 0x40)
                                       {
-                                        if (pwc != NULL)
-                                          *pwc = ((unsigned int) (c & 0x07) << 18)
-                                                 | ((unsigned int) (c2 ^ 0x80) << 12)
-                                                 | ((unsigned int) (c3 ^ 0x80) << 6)
-                                                 | (unsigned int) (c4 ^ 0x80);
-                                        res = 4;
-                                        goto success;
+                                        unsigned int wc
+                                          = (((unsigned int) (c & 0x07) << 18)
+                                             | ((unsigned int) (c2 ^ 0x80)
+                                                << 12)
+                                             | ((unsigned int) (c3 ^ 0x80) << 6)
+                                             | (unsigned int) (c4 ^ 0x80));
+                                        if (wc <= WCHAR_MAX)
+                                          {
+                                            if (pwc != NULL)
+                                              *pwc = wc;
+                                            res = 4;
+                                            goto success;
+                                          }
                                       }
                                   }
                               }