From: Bruno Haible Date: Thu, 13 Jul 2023 09:15:04 +0000 (+0200) Subject: c32_get_mapping: New module. X-Git-Tag: v1.0~1116 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=07edc55417b0677ffd2d0ad50e2b64d43cafb9a9;p=gnulib.git c32_get_mapping: New module. * lib/uchar.in.h (c32_mapping_t): New type. (c32_get_mapping): New declaration. * lib/c32_get_mapping.c: New file, based on lib/wctrans-impl.h. * m4/uchar_h.m4 (gl_UCHAR_H_REQUIRE_DEFAULTS): Initialize GNULIB_C32_GET_MAPPING. * modules/uchar (Makefile.am): Substitute GNULIB_C32_GET_MAPPING. * modules/c32_get_mapping: New file. --- diff --git a/ChangeLog b/ChangeLog index 3f8e0c7744..6356827f51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2023-07-13 Bruno Haible + c32_get_mapping: New module. + * lib/uchar.in.h (c32_mapping_t): New type. + (c32_get_mapping): New declaration. + * lib/c32_get_mapping.c: New file, based on lib/wctrans-impl.h. + * m4/uchar_h.m4 (gl_UCHAR_H_REQUIRE_DEFAULTS): Initialize + GNULIB_C32_GET_MAPPING. + * modules/uchar (Makefile.am): Substitute GNULIB_C32_GET_MAPPING. + * modules/c32_get_mapping: New file. + towctrans: Relax license. * modules/towctrans (License): Change to LGPLv2+. * lib/towctrans.c: Update license notice. diff --git a/lib/c32_get_mapping.c b/lib/c32_get_mapping.c new file mode 100644 index 0000000000..691e37a295 --- /dev/null +++ b/lib/c32_get_mapping.c @@ -0,0 +1,54 @@ +/* Get descriptor for a 32-bit wide character case conversion. + 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_MAPPING +/* Specification. */ +#include + +#include +#include + +#if _GL_WCHAR_T_IS_UCS4 +_GL_EXTERN_INLINE +#endif +c32_mapping_t +c32_get_mapping (const char *name) +{ +#if _GL_WCHAR_T_IS_UCS4 + return wctrans (name); +#else + if (name[0] == 't' + && name[1] == 'o') + switch (name[2]) + { + case 'l': + if (strcmp (name + 3, "ower") == 0) + return c32tolower; + break; + case 'u': + if (strcmp (name + 3, "pper") == 0) + return c32toupper; + break; + default: + break; + } + return (c32_mapping_t) 0; +#endif +} diff --git a/lib/uchar.in.h b/lib/uchar.in.h index edb6a751fd..28a5bd6244 100644 --- a/lib/uchar.in.h +++ b/lib/uchar.in.h @@ -729,6 +729,41 @@ _GL_CXXALIASWARN (c32_apply_type_test); #endif +#if @GNULIB_C32_GET_MAPPING@ +/* A scalar type. Instances of this type, other than (c32_mapping_t) 0, + represent a character mapping. It can be applied to 32-bit wide characters. + It is the counterpart of type 'wctrans_t' for wide characters. + To apply a certain mapping to a given character, use the function + 'c32_apply_mapping'. */ +# if _GL_WCHAR_T_IS_UCS4 +typedef wctrans_t c32_mapping_t; +# else +typedef wint_t (*c32_mapping_t) (wint_t wc); +# endif +#endif + +/* Return a character mapping with the given name, or (c32_mapping_t) 0 + if the designated mapping does not exist. + This function is the counterpart of function 'wctrans' for wide characters. + */ +#if @GNULIB_C32_GET_MAPPING@ +# if _GL_WCHAR_T_IS_UCS4 && !defined IN_C32_GET_MAPPING +_GL_BEGIN_C_LINKAGE +_GL_INLINE _GL_ARG_NONNULL ((1)) c32_mapping_t +c32_get_mapping (const char *name) +{ + return wctrans (name); +} +_GL_END_C_LINKAGE +# else +_GL_FUNCDECL_SYS (c32_get_mapping, c32_mapping_t, (const char *name) + _GL_ARG_NONNULL ((1))); +# endif +_GL_CXXALIAS_SYS (c32_get_mapping, c32_mapping_t, (const char *name)); +_GL_CXXALIASWARN (c32_get_mapping); +#endif + + _GL_INLINE_HEADER_END #endif /* _@GUARD_PREFIX@_UCHAR_H */ diff --git a/m4/uchar_h.m4 b/m4/uchar_h.m4 index 2bc52480d1..16cce8a468 100644 --- a/m4/uchar_h.m4 +++ b/m4/uchar_h.m4 @@ -1,4 +1,4 @@ -# uchar_h.m4 serial 29 +# uchar_h.m4 serial 30 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, @@ -224,6 +224,7 @@ AC_DEFUN([gl_UCHAR_H_REQUIRE_DEFAULTS], gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32SWIDTH]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32TOB]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32_APPLY_TYPE_TEST]) + gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32_GET_MAPPING]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_C32_GET_TYPE_TEST]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOC16]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOC32]) diff --git a/modules/c32_get_mapping b/modules/c32_get_mapping new file mode 100644 index 0000000000..140a92e99b --- /dev/null +++ b/modules/c32_get_mapping @@ -0,0 +1,31 @@ +Description: +c32_get_mapping() function: get descriptor for a 32-bit wide character +case conversion. + +Files: +lib/c32_get_mapping.c + +Depends-on: +uchar +wctrans +c32tolower +c32toupper + +configure.ac: +gl_UCHAR_MODULE_INDICATOR([c32_get_mapping]) + +Makefile.am: +lib_SOURCES += c32_get_mapping.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 1f42c6a08c..4e4d0ecd69 100644 --- a/modules/uchar +++ b/modules/uchar @@ -61,6 +61,7 @@ uchar.h: uchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) -e 's/@''GNULIB_C32SWIDTH''@/$(GNULIB_C32SWIDTH)/g' \ -e 's/@''GNULIB_C32TOB''@/$(GNULIB_C32TOB)/g' \ -e 's/@''GNULIB_C32_APPLY_TYPE_TEST''@/$(GNULIB_C32_APPLY_TYPE_TEST)/g' \ + -e 's/@''GNULIB_C32_GET_MAPPING''@/$(GNULIB_C32_GET_MAPPING)/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' \