From 43dc3f65057b41b0f3e292996be562037622772e Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 12 Jul 2023 22:44:52 +0200 Subject: [PATCH] c32_get_type_test: New module. * lib/uchar.in.h (c32_type_test_t): New type. (c32_get_type_test): New declaration. * lib/c32_get_type_test.c: New file, based on lib/wctype-impl.h. * m4/uchar_h.m4 (gl_UCHAR_H_REQUIRE_DEFAULTS): Initialize GNULIB_C32_GET_TYPE_TEST. * modules/uchar (Makefile.am): Substitute GNULIB_C32_GET_TYPE_TEST. * modules/c32_get_type_test: New file. --- ChangeLog | 9 +++ lib/c32_get_type_test.c | 113 ++++++++++++++++++++++++++++++++++++++ lib/uchar.in.h | 36 ++++++++++++ m4/uchar_h.m4 | 3 +- modules/c32_get_type_test | 41 ++++++++++++++ modules/uchar | 1 + 6 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 lib/c32_get_type_test.c create mode 100644 modules/c32_get_type_test diff --git a/ChangeLog b/ChangeLog index 1d9466b86d..378392a900 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2023-07-12 Bruno Haible + c32_get_type_test: New module. + * lib/uchar.in.h (c32_type_test_t): New type. + (c32_get_type_test): New declaration. + * lib/c32_get_type_test.c: New file, based on lib/wctype-impl.h. + * m4/uchar_h.m4 (gl_UCHAR_H_REQUIRE_DEFAULTS): Initialize + GNULIB_C32_GET_TYPE_TEST. + * modules/uchar (Makefile.am): Substitute GNULIB_C32_GET_TYPE_TEST. + * modules/c32_get_type_test: New file. + iswctype: Relax license. * modules/iswctype (License): Change to LGPLv2+. * lib/iswctype.c: Update license notice. diff --git a/lib/c32_get_type_test.c b/lib/c32_get_type_test.c new file mode 100644 index 0000000000..77d0a133e9 --- /dev/null +++ b/lib/c32_get_type_test.c @@ -0,0 +1,113 @@ +/* Get descriptor for a 32-bit wide character property. + Copyright (C) 2011-2023 Free Software Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2023. */ + +#include + +#define IN_C32_GET_TYPE_TEST +/* Specification. */ +#include + +#include +#include + +#if _GL_WCHAR_T_IS_UCS4 +_GL_EXTERN_INLINE +#endif +c32_type_test_t +c32_get_type_test (const char *name) +{ +#if _GL_WCHAR_T_IS_UCS4 + return wctype (name); +#else + switch (name[0]) + { + case 'a': + switch (name[1]) + { + case 'l': + switch (name[2]) + { + case 'n': + if (strcmp (name + 3, "um") == 0) + return c32isalnum; + break; + case 'p': + if (strcmp (name + 3, "ha") == 0) + return c32isalpha; + break; + default: + break; + } + break; + default: + break; + } + break; + case 'b': + if (strcmp (name + 1, "lank") == 0) + return c32isblank; + break; + case 'c': + if (strcmp (name + 1, "ntrl") == 0) + return c32iscntrl; + break; + case 'd': + if (strcmp (name + 1, "igit") == 0) + return c32isdigit; + break; + case 'g': + if (strcmp (name + 1, "raph") == 0) + return c32isgraph; + break; + case 'l': + if (strcmp (name + 1, "ower") == 0) + return c32islower; + break; + case 'p': + switch (name[1]) + { + case 'r': + if (strcmp (name + 2, "int") == 0) + return c32isprint; + break; + case 'u': + if (strcmp (name + 2, "nct") == 0) + return c32ispunct; + break; + default: + break; + } + break; + case 's': + if (strcmp (name + 1, "pace") == 0) + return c32isspace; + break; + case 'u': + if (strcmp (name + 1, "pper") == 0) + return c32isupper; + break; + case 'x': + if (strcmp (name + 1, "digit") == 0) + return c32isxdigit; + break; + default: + break; + } + return (c32_type_test_t) 0; +#endif +} diff --git a/lib/uchar.in.h b/lib/uchar.in.h index 3ead6f5bce..72ec182308 100644 --- a/lib/uchar.in.h +++ b/lib/uchar.in.h @@ -669,6 +669,42 @@ _GL_CXXALIASWARN (mbstoc32s); #endif +#if @GNULIB_C32_GET_TYPE_TEST@ +/* A scalar type. Instances of this type, other than (c32_type_test_t) 0, + represent a character property, sometimes also viewed as a "character class". + It can be applied to 32-bit wide characters. It is the counterpart of + type 'wctype_t' for wide characters. + To test whether a given character has a certain property, use the function + 'c32_apply_type_test'. */ +# if _GL_WCHAR_T_IS_UCS4 +typedef wctype_t c32_type_test_t; +# else +typedef /*bool*/int (*c32_type_test_t) (wint_t wc); +# endif +#endif + +/* Return a character property with the given name, or (c32_type_test_t) 0 + if the designated property does not exist. + This function is the counterpart of function 'wctype' for wide characters. + */ +#if @GNULIB_C32_GET_TYPE_TEST@ +# if _GL_WCHAR_T_IS_UCS4 && !defined IN_C32_GET_TYPE_TEST +_GL_BEGIN_C_LINKAGE +_GL_INLINE _GL_ARG_NONNULL ((1)) c32_type_test_t +c32_get_type_test (const char *name) +{ + return wctype (name); +} +_GL_END_C_LINKAGE +# else +_GL_FUNCDECL_SYS (c32_get_type_test, c32_type_test_t, (const char *name) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (c32_get_type_test, c32_type_test_t, (const char *name)); +_GL_CXXALIASWARN (c32_get_type_test); +#endif + + _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_UCHAR_H */ diff --git a/m4/uchar_h.m4 b/m4/uchar_h.m4 index 1b784d2aef..0fdaf47dbc 100644 --- a/m4/uchar_h.m4 +++ b/m4/uchar_h.m4 @@ -1,4 +1,4 @@ -# uchar_h.m4 serial 27 +# uchar_h.m4 serial 28 dnl Copyright (C) 2019-2023 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -223,6 +223,7 @@ AC_DEFUN([gl_UCHAR_H_REQUIRE_DEFAULTS], gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32STOMBS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32SWIDTH]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32TOB]) + gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32_GET_TYPE_TEST]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOC16]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOC32]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNRTOC32S]) diff --git a/modules/c32_get_type_test b/modules/c32_get_type_test new file mode 100644 index 0000000000..4b54660714 --- /dev/null +++ b/modules/c32_get_type_test @@ -0,0 +1,41 @@ +Description: +c32_get_type_test() function: get descriptor for a 32-bit wide character +property. + +Files: +lib/c32_get_type_test.c + +Depends-on: +uchar +wctype +c32isalnum +c32isalpha +c32isblank +c32iscntrl +c32isdigit +c32isgraph +c32islower +c32isprint +c32ispunct +c32isspace +c32isupper +c32isxdigit + +configure.ac: +gl_UCHAR_MODULE_INDICATOR([c32_get_type_test]) + +Makefile.am: +lib_SOURCES += c32_get_type_test.c + +Include: + + +Link: +$(LTLIBUNISTRING) when linking with libtool, $(LIBUNISTRING) otherwise +$(LTLIBC32CONV) when linking with libtool, $(LIBC32CONV) otherwise + +License: +LGPLv2+ + +Maintainer: +Bruno Haible diff --git a/modules/uchar b/modules/uchar index f5539abbb3..6c52c7d3f3 100644 --- a/modules/uchar +++ b/modules/uchar @@ -60,6 +60,7 @@ uchar.h: uchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) -e 's/@''GNULIB_C32STOMBS''@/$(GNULIB_C32STOMBS)/g' \ -e 's/@''GNULIB_C32SWIDTH''@/$(GNULIB_C32SWIDTH)/g' \ -e 's/@''GNULIB_C32TOB''@/$(GNULIB_C32TOB)/g' \ + -e 's/@''GNULIB_C32_GET_TYPE_TEST''@/$(GNULIB_C32_GET_TYPE_TEST)/g' \ -e 's/@''GNULIB_MBRTOC16''@/$(GNULIB_MBRTOC16)/g' \ -e 's/@''GNULIB_MBRTOC32''@/$(GNULIB_MBRTOC32)/g' \ -e 's/@''GNULIB_MBSNRTOC32S''@/$(GNULIB_MBSNRTOC32S)/g' \ -- 2.39.5