about summary refs log tree commit diff
path: root/wcsmbs
diff options
context:
space:
mode:
Diffstat (limited to 'wcsmbs')
-rw-r--r--wcsmbs/Makefile14
-rw-r--r--wcsmbs/Versions8
-rw-r--r--wcsmbs/tst-wcstol-binary-c11.c29
-rw-r--r--wcsmbs/tst-wcstol-binary-c2x.c32
-rw-r--r--wcsmbs/tst-wcstol-binary-gnu11.c34
-rw-r--r--wcsmbs/tst-wcstol-binary-gnu2x.c27
-rw-r--r--wcsmbs/wchar.h111
-rw-r--r--wcsmbs/wcstol_l.c3
-rw-r--r--wcsmbs/wcstoll.c1
-rw-r--r--wcsmbs/wcstoll_l.c3
-rw-r--r--wcsmbs/wcstoul_l.c3
-rw-r--r--wcsmbs/wcstoull.c1
-rw-r--r--wcsmbs/wcstoull_l.c3
13 files changed, 268 insertions, 1 deletions
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index 740d87c994..16ece4c110 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -55,7 +55,11 @@ tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
 	 tst-wcstod-nan-sign tst-c16-surrogate tst-c32-state \
 	 test-mbrtoc8 test-c8rtomb \
 	 $(addprefix test-,$(strop-tests)) tst-mbstowcs \
-	 tst-wprintf-binary
+	 tst-wprintf-binary \
+	 tst-wcstol-binary-c11 \
+	 tst-wcstol-binary-c2x \
+	 tst-wcstol-binary-gnu11 \
+	 tst-wcstol-binary-gnu2x
 
 include ../Rules
 
@@ -122,3 +126,11 @@ CPPFLAGS-wcstold_l.c += -I../stdlib
 
 $(objpfx)tst-wcstod-nan-locale: $(libm)
 $(objpfx)tst-wcstod-nan-sign: $(libm)
+
+# Some versions of GCC supported for building glibc do not support -std=c2x
+# or -std=gnu2x, so the tests for those versions use -std=c11 and -std=gnu11
+# and then _ISOC2X_SOURCE is defined in the test as needed.
+CFLAGS-tst-wcstol-binary-c11.c += -std=c11
+CFLAGS-tst-wcstol-binary-c2x.c += -std=c11
+CFLAGS-tst-wcstol-binary-gnu11.c += -std=gnu11
+CFLAGS-tst-wcstol-binary-gnu2x.c += -std=gnu11
diff --git a/wcsmbs/Versions b/wcsmbs/Versions
index ec28acfb73..1866cd8d6e 100644
--- a/wcsmbs/Versions
+++ b/wcsmbs/Versions
@@ -52,4 +52,12 @@ libc {
   GLIBC_2.36 {
     c8rtomb; mbrtoc8;
   }
+  GLIBC_2.38 {
+    __isoc23_wcstol;
+    __isoc23_wcstoll;
+    __isoc23_wcstoul;
+    __isoc23_wcstoull;
+    __isoc23_wcstoimax;
+    __isoc23_wcstoumax;
+  }
 }
diff --git a/wcsmbs/tst-wcstol-binary-c11.c b/wcsmbs/tst-wcstol-binary-c11.c
new file mode 100644
index 0000000000..bff1d879f0
--- /dev/null
+++ b/wcsmbs/tst-wcstol-binary-c11.c
@@ -0,0 +1,29 @@
+/* Test wcstol functions with C2X binary integers (wide strings,
+   no extensions to C11).
+   Copyright (C) 2022-2023 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 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
+   Lesser General Public License for more details.
+
+   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/>.  */
+
+#undef _GNU_SOURCE
+
+#define CHAR wchar_t
+#define FNPFX wcsto
+#define L_(C) L ## C
+#define TEST_C2X 0
+#define TEST_Q 0
+#define TEST_LOCALE 0
+
+#include "../stdlib/tst-strtol-binary-main.c"
diff --git a/wcsmbs/tst-wcstol-binary-c2x.c b/wcsmbs/tst-wcstol-binary-c2x.c
new file mode 100644
index 0000000000..0f8ef44854
--- /dev/null
+++ b/wcsmbs/tst-wcstol-binary-c2x.c
@@ -0,0 +1,32 @@
+/* Test wcstol functions with C2X binary integers (wide strings,
+   no extensions).
+   Copyright (C) 2022-2023 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 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
+   Lesser General Public License for more details.
+
+   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/>.  */
+
+/* Some versions of GCC supported for building glibc do not support
+   -std=c2x.  */
+#undef _GNU_SOURCE
+#define _ISOC2X_SOURCE
+
+#define CHAR wchar_t
+#define FNPFX wcsto
+#define L_(C) L ## C
+#define TEST_C2X 1
+#define TEST_Q 0
+#define TEST_LOCALE 0
+
+#include "../stdlib/tst-strtol-binary-main.c"
diff --git a/wcsmbs/tst-wcstol-binary-gnu11.c b/wcsmbs/tst-wcstol-binary-gnu11.c
new file mode 100644
index 0000000000..189f217563
--- /dev/null
+++ b/wcsmbs/tst-wcstol-binary-gnu11.c
@@ -0,0 +1,34 @@
+/* Test wcstol functions with C2X binary integers (wide strings, GNU
+   extensions, C2X wcstol features disabled).
+   Copyright (C) 2022-2023 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 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
+   Lesser General Public License for more details.
+
+   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/>.  */
+
+#include <features.h>
+/* This file tests the old versions of GNU extension functions, which
+   are not normally available to new binaries because GNU extensions
+   normally imply C2X wcstol features.  */
+#undef __GLIBC_USE_C2X_STRTOL
+#define __GLIBC_USE_C2X_STRTOL 0
+
+#define CHAR wchar_t
+#define FNPFX wcsto
+#define L_(C) L ## C
+#define TEST_C2X 0
+#define TEST_Q 1
+#define TEST_LOCALE 1
+
+#include "../stdlib/tst-strtol-binary-main.c"
diff --git a/wcsmbs/tst-wcstol-binary-gnu2x.c b/wcsmbs/tst-wcstol-binary-gnu2x.c
new file mode 100644
index 0000000000..707d4076f1
--- /dev/null
+++ b/wcsmbs/tst-wcstol-binary-gnu2x.c
@@ -0,0 +1,27 @@
+/* Test wcstol functions with C2X binary integers (wide strings, GNU
+   extensions).
+   Copyright (C) 2022-2023 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 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
+   Lesser General Public License for more details.
+
+   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 CHAR wchar_t
+#define FNPFX wcsto
+#define L_(C) L ## C
+#define TEST_C2X 1
+#define TEST_Q 1
+#define TEST_LOCALE 1
+
+#include "../stdlib/tst-strtol-binary-main.c"
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index 69e920b8c2..cde0d32b0a 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -467,6 +467,67 @@ extern unsigned long long int wcstouq (const wchar_t *__restrict __nptr,
 				       int __base) __THROW;
 #endif /* Use GNU.  */
 
+/* Versions of the above functions that handle '0b' and '0B' prefixes
+   in base 0 or 2.  */
+#if __GLIBC_USE (C2X_STRTOL)
+# ifdef __REDIRECT
+extern long int __REDIRECT_NTH (wcstol, (const wchar_t *__restrict __nptr,
+					 wchar_t **__restrict __endptr,
+					 int __base), __isoc23_wcstol);
+extern unsigned long int __REDIRECT_NTH (wcstoul,
+					 (const wchar_t *__restrict __nptr,
+					  wchar_t **__restrict __endptr,
+					  int __base), __isoc23_wcstoul);
+__extension__
+extern long long int __REDIRECT_NTH (wcstoll,
+				     (const wchar_t *__restrict __nptr,
+				      wchar_t **__restrict __endptr,
+				      int __base), __isoc23_wcstoll);
+__extension__
+extern unsigned long long int __REDIRECT_NTH (wcstoull,
+					      (const wchar_t *__restrict __nptr,
+					       wchar_t **__restrict __endptr,
+					       int __base), __isoc23_wcstoull);
+#  ifdef __USE_GNU
+__extension__
+extern long long int __REDIRECT_NTH (wcstoq, (const wchar_t *__restrict __nptr,
+					      wchar_t **__restrict __endptr,
+					      int __base), __isoc23_wcstoll);
+__extension__
+extern unsigned long long int __REDIRECT_NTH (wcstouq,
+					      (const wchar_t *__restrict __nptr,
+					       wchar_t **__restrict __endptr,
+					       int __base), __isoc23_wcstoull);
+#  endif
+# else
+extern long int __isoc23_wcstol (const wchar_t *__restrict __nptr,
+				 wchar_t **__restrict __endptr, int __base)
+     __THROW;
+extern unsigned long int __isoc23_wcstoul (const wchar_t *__restrict __nptr,
+					   wchar_t **__restrict __endptr,
+					   int __base)
+     __THROW;
+__extension__
+extern long long int __isoc23_wcstoll (const wchar_t *__restrict __nptr,
+				       wchar_t **__restrict __endptr,
+				       int __base)
+     __THROW;
+__extension__
+extern unsigned long long int __isoc23_wcstoull (const wchar_t *__restrict __nptr,
+						 wchar_t **__restrict __endptr,
+						 int __base)
+     __THROW;
+#  define wcstol __isoc23_wcstol
+#  define wcstoul __isoc23_wcstoul
+#  define wcstoll __isoc23_wcstoll
+#  define wcstoull __isoc23_wcstoull
+#  ifdef __USE_GNU
+#   define wcstoq __isoc23_wcstoll
+#   define wcstouq __isoc23_wcstoull
+#  endif
+# endif
+#endif
+
 #ifdef __USE_GNU
 /* Parallel versions of the functions above which take the locale to
    use as an additional parameter.  These are GNU extensions inspired
@@ -490,6 +551,56 @@ extern unsigned long long int wcstoull_l (const wchar_t *__restrict __nptr,
 					  int __base, locale_t __loc)
      __THROW;
 
+/* Versions of the above functions that handle '0b' and '0B' prefixes
+   in base 0 or 2.  */
+# if __GLIBC_USE (C2X_STRTOL)
+#  ifdef __REDIRECT
+extern long int __REDIRECT_NTH (wcstol_l, (const wchar_t *__restrict __nptr,
+					   wchar_t **__restrict __endptr,
+					   int __base, locale_t __loc),
+				__isoc23_wcstol_l);
+extern unsigned long int __REDIRECT_NTH (wcstoul_l,
+					 (const wchar_t *__restrict __nptr,
+					  wchar_t **__restrict __endptr,
+					  int __base, locale_t __loc),
+					 __isoc23_wcstoul_l);
+__extension__
+extern long long int __REDIRECT_NTH (wcstoll_l,
+				     (const wchar_t *__restrict __nptr,
+				      wchar_t **__restrict __endptr,
+				      int __base, locale_t __loc),
+				     __isoc23_wcstoll_l);
+__extension__
+extern unsigned long long int __REDIRECT_NTH (wcstoull_l,
+					      (const wchar_t *__restrict __nptr,
+					       wchar_t **__restrict __endptr,
+					       int __base, locale_t __loc),
+					      __isoc23_wcstoull_l);
+#  else
+extern long int __isoc23_wcstol_l (const wchar_t *__restrict __nptr,
+				   wchar_t **__restrict __endptr, int __base,
+				   locale_t __loc) __THROW;
+extern unsigned long int __isoc23_wcstoul_l (const wchar_t *__restrict __nptr,
+					     wchar_t **__restrict __endptr,
+					     int __base, locale_t __loc)
+     __THROW;
+__extension__
+extern long long int __isoc23_wcstoll_l (const wchar_t *__restrict __nptr,
+					 wchar_t **__restrict __endptr,
+					 int __base, locale_t __loc)
+     __THROW;
+__extension__
+extern unsigned long long int __isoc23_wcstoull_l (const wchar_t *__restrict __nptr,
+						   wchar_t **__restrict __endptr,
+						   int __base, locale_t __loc)
+     __THROW;
+#   define wcstol_l __isoc23_wcstol_l
+#   define wcstoul_l __isoc23_wcstoul_l
+#   define wcstoll_l __isoc23_wcstoll_l
+#   define wcstoull_l __isoc23_wcstoull_l
+#  endif
+# endif
+
 extern double wcstod_l (const wchar_t *__restrict __nptr,
 			wchar_t **__restrict __endptr, locale_t __loc)
      __THROW;
diff --git a/wcsmbs/wcstol_l.c b/wcsmbs/wcstol_l.c
index a6cc73a549..c6403e6ee3 100644
--- a/wcsmbs/wcstol_l.c
+++ b/wcsmbs/wcstol_l.c
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <features.h>
+#undef __GLIBC_USE_C2X_STRTOL
+#define __GLIBC_USE_C2X_STRTOL 0
 #define __need_wchar_t
 #include <stddef.h>
 #include <locale.h>
diff --git a/wcsmbs/wcstoll.c b/wcsmbs/wcstoll.c
index 8f28b96663..c4a66bb92f 100644
--- a/wcsmbs/wcstoll.c
+++ b/wcsmbs/wcstoll.c
@@ -22,3 +22,4 @@
 
 weak_alias (wcstoll, wcstoq)
 weak_alias (wcstoll, wcstoimax)
+weak_alias (__isoc23_wcstoll, __isoc23_wcstoimax)
diff --git a/wcsmbs/wcstoll_l.c b/wcsmbs/wcstoll_l.c
index c6c57d8586..d445f7425e 100644
--- a/wcsmbs/wcstoll_l.c
+++ b/wcsmbs/wcstoll_l.c
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <features.h>
+#undef __GLIBC_USE_C2X_STRTOL
+#define __GLIBC_USE_C2X_STRTOL 0
 #define __need_wchar_t
 #include <stddef.h>
 #include <locale.h>
diff --git a/wcsmbs/wcstoul_l.c b/wcsmbs/wcstoul_l.c
index 98dc8204ec..2c61d41777 100644
--- a/wcsmbs/wcstoul_l.c
+++ b/wcsmbs/wcstoul_l.c
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <features.h>
+#undef __GLIBC_USE_C2X_STRTOL
+#define __GLIBC_USE_C2X_STRTOL 0
 #define __need_wchar_t
 #include <stddef.h>
 #include <locale.h>
diff --git a/wcsmbs/wcstoull.c b/wcsmbs/wcstoull.c
index 77d1e5d5d8..f37a42f2c8 100644
--- a/wcsmbs/wcstoull.c
+++ b/wcsmbs/wcstoull.c
@@ -22,3 +22,4 @@
 
 weak_alias (wcstoull, wcstouq)
 weak_alias (wcstoull, wcstoumax)
+weak_alias (__isoc23_wcstoull, __isoc23_wcstoumax)
diff --git a/wcsmbs/wcstoull_l.c b/wcsmbs/wcstoull_l.c
index 0ceb112a78..97923ce4ef 100644
--- a/wcsmbs/wcstoull_l.c
+++ b/wcsmbs/wcstoull_l.c
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <features.h>
+#undef __GLIBC_USE_C2X_STRTOL
+#define __GLIBC_USE_C2X_STRTOL 0
 #define __need_wchar_t
 #include <stddef.h>
 #include <locale.h>