]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - wctype/wcfuncs.c
x86: Add seperate non-temporal tunable for memset
[thirdparty/glibc.git] / wctype / wcfuncs.c
index b5ac89060953038402e57e23fdb94b527d78e25d..1ddf36075ddc2960508898b5e4c4aed698a33aef 100644 (file)
@@ -1,52 +1,94 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1996-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library 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.
 
-The GNU C Library 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
-Library General Public License for more details.
+   The GNU C Library 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 Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
-#define        __NO_WCTYPE
+#include <ctype.h>
 #include <wctype.h>
-#include <ctype.h>     /* For __ctype_tolower and __ctype_toupper.  */
+#include <locale/localeinfo.h>
+
+#include "wchar-lookup.h"
 
 /* Provide real-function versions of all the wctype macros.  */
 
-#define        func(name, type) \
-  int name (wc) wint_t wc; { return iswctype (wc, type); }
-
-func (iswalnum, _ISalnum)
-func (iswalpha, _ISalpha)
-func (iswcntrl, _IScntrl)
-func (iswdigit, _ISdigit)
-func (iswlower, _ISlower)
-func (iswgraph, _ISgraph)
-func (iswprint, _ISprint)
-func (iswpunct, _ISpunct)
-func (iswspace, _ISspace)
-func (iswupper, _ISupper)
-func (iswxdigit, _ISxdigit)
+#define        func(name, type)                                                      \
+  extern int __isw##name (wint_t __wc);                                              \
+  int                                                                        \
+  __isw##name (wint_t wc)                                                    \
+  {                                                                          \
+    if (isascii (wc))                                                        \
+      return is##name ((int) wc);                                            \
+    size_t i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_CLASS_OFFSET) + type;    \
+    const char *desc = _NL_CURRENT (LC_CTYPE, i);                            \
+    return wctype_table_lookup (desc, wc);                                   \
+  }                                                                          \
+  weak_alias (__isw##name, isw##name)
+
+#undef iswalnum
+func (alnum, __ISwalnum)
+libc_hidden_def (__iswalnum)
+libc_hidden_weak (iswalnum)
+#undef iswalpha
+func (alpha, __ISwalpha)
+libc_hidden_weak (iswalpha)
+#undef iswblank
+func (blank, __ISwblank)
+#undef iswcntrl
+func (cntrl, __ISwcntrl)
+#undef iswdigit
+func (digit, __ISwdigit)
+libc_hidden_weak (iswdigit)
+#undef iswlower
+func (lower, __ISwlower)
+libc_hidden_def (__iswlower)
+libc_hidden_weak (iswlower)
+#undef iswgraph
+func (graph, __ISwgraph)
+#undef iswprint
+func (print, __ISwprint)
+#undef iswpunct
+func (punct, __ISwpunct)
+#undef iswspace
+func (space, __ISwspace)
+libc_hidden_weak (iswspace)
+#undef iswupper
+func (upper, __ISwupper)
+#undef iswxdigit
+func (xdigit, __ISwxdigit)
+libc_hidden_weak (iswxdigit)
 
+#undef towlower
 wint_t
-towlower (wc)
-     wint_t wc;
+__towlower (wint_t wc)
 {
-  return towctrans (wc, __ctype_tolower);
+  size_t i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET) + __TOW_tolower;
+  const char *desc = _NL_CURRENT (LC_CTYPE, i);
+  return wctrans_table_lookup (desc, wc);
 }
+libc_hidden_def (__towlower)
+weak_alias (__towlower, towlower)
+libc_hidden_weak (towlower)
 
+#undef towupper
 wint_t
-towupper (wc)
-     wint_t wc;
+__towupper (wint_t wc)
 {
-  return towctrans (wc, __ctype_toupper);
+  size_t i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET) + __TOW_toupper;
+  const char *desc = _NL_CURRENT (LC_CTYPE, i);
+  return wctrans_table_lookup (desc, wc);
 }
+libc_hidden_def (__towupper)
+weak_alias (__towupper, towupper)
+libc_hidden_weak (towupper)