]> Savannah Git Hosting - gnulib.git/commitdiff
c32isalnum: New module.
authorBruno Haible <bruno@clisp.org>
Sat, 25 Jan 2020 22:36:41 +0000 (23:36 +0100)
committerBruno Haible <bruno@clisp.org>
Sat, 25 Jan 2020 22:42:14 +0000 (23:42 +0100)
* lib/c32isalnum.c: New file.
* lib/c32is-impl.h: New file.
* modules/c32isalnum: New file.
* doc/posix-functions/iswalnum.texi: Mention the new module.

ChangeLog
doc/posix-functions/iswalnum.texi
lib/c32is-impl.h [new file with mode: 0644]
lib/c32isalnum.c [new file with mode: 0644]
modules/c32isalnum [new file with mode: 0644]

index a41e8ace25125e9121f8d83abefdd477d38acd42..4ffcc0bcc113caa11e9d79e05259594bef7de0fd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2020-01-25  Bruno Haible  <bruno@clisp.org>
+
+       c32isalnum: New module.
+       * lib/c32isalnum.c: New file.
+       * lib/c32is-impl.h: New file.
+       * modules/c32isalnum: New file.
+       * doc/posix-functions/iswalnum.texi: Mention the new module.
+
 2020-01-25  Bruno Haible  <bruno@clisp.org>
 
        uchar: Preparations for modules c32isalnum, ..., c32isxdigit.
index 1ccb315d3309b798d0c3f75825919809c3b8ac69..b3b6d243515c65c954cbd01ed6022a33d7e9456e 100644 (file)
@@ -20,6 +20,9 @@ OS X 10.8.
 Portability problems not fixed by Gnulib:
 @itemize
 @item
-On Windows and 32-bit AIX platforms, @code{wchar_t} is a 16-bit type and therefore cannot
-accommodate all Unicode characters.
+On Windows and 32-bit AIX platforms, @code{wchar_t} is a 16-bit type and
+therefore cannot accommodate all Unicode characters.
+However, the Gnulib function @code{c32isalnum}, provided by Gnulib module
+@code{c32isalnum}, operates on 32-bit wide characters and therefore does not
+have this limitation.
 @end itemize
diff --git a/lib/c32is-impl.h b/lib/c32is-impl.h
new file mode 100644 (file)
index 0000000..fd5f06a
--- /dev/null
@@ -0,0 +1,95 @@
+/* Test whether a 32-bit wide character belongs to a specific character class.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2020.  */
+
+#include <wchar.h>
+#include <wctype.h>
+
+#ifdef __CYGWIN__
+# include <cygwin/version.h>
+#endif
+
+#if GNULIB_defined_mbstate_t
+# include "localcharset.h"
+# include "streq.h"
+#endif
+
+#include "unictype.h"
+#include "verify.h"
+
+int
+FUNC (wint_t wc)
+{
+  /* The char32_t encoding of a multibyte character is defined by the way
+     mbrtoc32() is defined.  */
+
+#if GNULIB_defined_mbstate_t            /* AIX, IRIX */
+  /* mbrtoc32() is defined on top of mbtowc() for the non-UTF-8 locales
+     and directly for the UTF-8 locales.  */
+  if (wc != WEOF)
+    {
+      const char *encoding = locale_charset ();
+      if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+        return UCS_FUNC (wc);
+      else
+        return WCHAR_FUNC (wc);
+    }
+  else
+    return 0;
+
+#elif HAVE_WORKING_MBRTOC32             /* glibc */
+  /* mbrtoc32() is essentially defined by the system libc.  */
+
+# if defined __GLIBC__
+  /* The char32_t encoding of a multibyte character is known to be the same as
+     the wchar_t encoding.  */
+  return WCHAR_FUNC (wc);
+# else
+  /* The char32_t encoding of a multibyte character is known to be UCS-4,
+     different from the the wchar_t encoding.  */
+  if (wc != WEOF)
+    return UCS_FUNC (wc);
+  else
+    return 0;
+# endif
+
+#elif _GL_LARGE_CHAR32_T                /* Cygwin, mingw, MSVC */
+  /* The wchar_t encoding is UTF-16.
+     The char32_t encoding is UCS-4.  */
+
+# if defined __CYGWIN__ && CYGWIN_VERSION_DLL_MAJOR >= 1007
+  /* As an extension to POSIX, the iswalnum() function of Cygwin >= 1.7
+     supports also wc arguments outside the Unicode BMP, that is, outside
+     the 'wchar_t' range.  See
+     <https://lists.gnu.org/archive/html/bug-gnulib/2011-02/msg00019.html>
+     = <https://cygwin.com/ml/cygwin/2011-02/msg00044.html>.  */
+  return WCHAR_FUNC (wc);
+# else
+  if (wc == WEOF || wc == (wchar_t) wc)
+    /* wc is in the range for the isw* functions.  */
+    return WCHAR_FUNC (wc);
+  else
+    return UCS_FUNC (wc);
+# endif
+
+#else /* macOS, FreeBSD, NetBSD, OpenBSD, HP-UX, Solaris, Minix, Android */
+  /* char32_t and wchar_t are equivalent.  */
+  verify (sizeof (char32_t) == sizeof (wchar_t));
+
+  return WCHAR_FUNC (wc);
+#endif
+}
diff --git a/lib/c32isalnum.c b/lib/c32isalnum.c
new file mode 100644 (file)
index 0000000..c81b833
--- /dev/null
@@ -0,0 +1,25 @@
+/* Test 32-bit wide character for being alphanumeric.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <uchar.h>
+
+#define FUNC c32isalnum
+#define WCHAR_FUNC iswalnum
+#define UCS_FUNC uc_is_alnum
+#include "c32is-impl.h"
diff --git a/modules/c32isalnum b/modules/c32isalnum
new file mode 100644 (file)
index 0000000..213ffdd
--- /dev/null
@@ -0,0 +1,33 @@
+Description:
+c32isalnum() function: test 32-bit wide character for being alphanumeric.
+
+Files:
+lib/c32isalnum.c
+lib/c32is-impl.h
+m4/mbrtoc32.m4
+
+Depends-on:
+uchar
+wchar
+wctype-h
+localcharset    [test $REPLACE_MBSTATE_T = 1]
+streq           [test $REPLACE_MBSTATE_T = 1]
+unictype/ctype-alnum
+verify
+
+configure.ac:
+AC_REQUIRE([gl_UCHAR_H])
+AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+gl_UCHAR_MODULE_INDICATOR([c32isalnum])
+
+Makefile.am:
+lib_SOURCES += c32isalnum.c
+
+Include:
+<uchar.h>
+
+License:
+LGPLv3+ or GPLv2
+
+Maintainer:
+Bruno Haible