about summary refs log tree commit diff
path: root/wcsmbs
diff options
context:
space:
mode:
Diffstat (limited to 'wcsmbs')
-rw-r--r--wcsmbs/Makefile16
-rw-r--r--wcsmbs/Versions6
-rw-r--r--wcsmbs/bits/wchar-ldbl.h24
-rw-r--r--wcsmbs/isoc23_fwscanf.c36
-rw-r--r--wcsmbs/isoc23_swscanf.c38
-rw-r--r--wcsmbs/isoc23_vfwscanf.c29
-rw-r--r--wcsmbs/isoc23_vswscanf.c30
-rw-r--r--wcsmbs/isoc23_vwscanf.c28
-rw-r--r--wcsmbs/isoc23_wscanf.c37
-rw-r--r--wcsmbs/tst-wscanf-binary-c11.c28
-rw-r--r--wcsmbs/tst-wscanf-binary-c2x.c31
-rw-r--r--wcsmbs/tst-wscanf-binary-gnu11.c26
-rw-r--r--wcsmbs/tst-wscanf-binary-gnu89.c26
-rw-r--r--wcsmbs/wchar.h76
14 files changed, 419 insertions, 12 deletions
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index 16ece4c110..b12a3b0750 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -43,6 +43,8 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
 	    wcsmbsload mbsrtowcs_l \
 	    isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf \
 	    isoc99_swscanf isoc99_vswscanf \
+	    isoc23_wscanf isoc23_vwscanf isoc23_fwscanf isoc23_vfwscanf \
+	    isoc23_swscanf isoc23_vswscanf \
 	    mbrtoc8 c8rtomb mbrtoc16 c16rtomb mbrtoc32 c32rtomb
 
 strop-tests :=  wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy wcsnlen \
@@ -59,7 +61,11 @@ tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
 	 tst-wcstol-binary-c11 \
 	 tst-wcstol-binary-c2x \
 	 tst-wcstol-binary-gnu11 \
-	 tst-wcstol-binary-gnu2x
+	 tst-wcstol-binary-gnu2x \
+	 tst-wscanf-binary-c11 \
+	 tst-wscanf-binary-c2x \
+	 tst-wscanf-binary-gnu11 \
+	 tst-wscanf-binary-gnu89
 
 include ../Rules
 
@@ -118,6 +124,10 @@ CFLAGS-isoc99_wscanf.c += -fexceptions
 CFLAGS-isoc99_fwscanf.c += -fexceptions
 CFLAGS-isoc99_vwscanf.c += -fexceptions
 CFLAGS-isoc99_vfwscanf.c += -fexceptions
+CFLAGS-isoc23_wscanf.c += -fexceptions
+CFLAGS-isoc23_fwscanf.c += -fexceptions
+CFLAGS-isoc23_vwscanf.c += -fexceptions
+CFLAGS-isoc23_vfwscanf.c += -fexceptions
 
 CPPFLAGS += $(libio-mtsafe)
 
@@ -134,3 +144,7 @@ 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
+CFLAGS-tst-wscanf-binary-c11.c += -std=c11 -DOBJPFX=\"$(objpfx)\"
+CFLAGS-tst-wscanf-binary-c2x.c += -std=c11 -DOBJPFX=\"$(objpfx)\"
+CFLAGS-tst-wscanf-binary-gnu11.c += -std=gnu11 -DOBJPFX=\"$(objpfx)\"
+CFLAGS-tst-wscanf-binary-gnu89.c += -std=gnu89 -DOBJPFX=\"$(objpfx)\"
diff --git a/wcsmbs/Versions b/wcsmbs/Versions
index 1866cd8d6e..2d9391348a 100644
--- a/wcsmbs/Versions
+++ b/wcsmbs/Versions
@@ -59,5 +59,11 @@ libc {
     __isoc23_wcstoull;
     __isoc23_wcstoimax;
     __isoc23_wcstoumax;
+    __isoc23_fwscanf;
+    __isoc23_swscanf;
+    __isoc23_vfwscanf;
+    __isoc23_vswscanf;
+    __isoc23_vwscanf;
+    __isoc23_wscanf;
   }
 }
diff --git a/wcsmbs/bits/wchar-ldbl.h b/wcsmbs/bits/wchar-ldbl.h
index 4c6f850a45..ee4a6391c8 100644
--- a/wcsmbs/bits/wchar-ldbl.h
+++ b/wcsmbs/bits/wchar-ldbl.h
@@ -29,13 +29,25 @@ __LDBL_REDIR_DECL (vwprintf);
 __LDBL_REDIR_DECL (vswprintf);
 # if !__GLIBC_USE (DEPRECATED_SCANF)
 #  if defined __LDBL_COMPAT
+#   if __GLIBC_USE (C2X_STRTOL)
+__LDBL_REDIR1_DECL (fwscanf, __nldbl___isoc23_fwscanf)
+__LDBL_REDIR1_DECL (wscanf, __nldbl___isoc23_wscanf)
+__LDBL_REDIR1_DECL (swscanf, __nldbl___isoc23_swscanf)
+#   else
 __LDBL_REDIR1_DECL (fwscanf, __nldbl___isoc99_fwscanf)
 __LDBL_REDIR1_DECL (wscanf, __nldbl___isoc99_wscanf)
 __LDBL_REDIR1_DECL (swscanf, __nldbl___isoc99_swscanf)
+#   endif
 #  elif __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+#   if __GLIBC_USE (C2X_STRTOL)
+__LDBL_REDIR1_DECL (fwscanf, __isoc23_fwscanfieee128)
+__LDBL_REDIR1_DECL (wscanf, __isoc23_wscanfieee128)
+__LDBL_REDIR1_DECL (swscanf, __isoc23_swscanfieee128)
+#   else
 __LDBL_REDIR1_DECL (fwscanf, __isoc99_fwscanfieee128)
 __LDBL_REDIR1_DECL (wscanf, __isoc99_wscanfieee128)
 __LDBL_REDIR1_DECL (swscanf, __isoc99_swscanfieee128)
+#   endif
 #  else
 #   error bits/stdlib-ldbl.h included when no ldbl redirections are required.
 #  endif
@@ -54,13 +66,25 @@ __LDBL_REDIR1_DECL (wcstold, __wcstoieee128)
 # endif
 # if !__GLIBC_USE (DEPRECATED_SCANF)
 #  if defined __LDBL_COMPAT
+#   if __GLIBC_USE (C2X_STRTOL)
+__LDBL_REDIR1_DECL (vfwscanf, __nldbl___isoc23_vfwscanf)
+__LDBL_REDIR1_DECL (vwscanf, __nldbl___isoc23_vwscanf)
+__LDBL_REDIR1_DECL (vswscanf, __nldbl___isoc23_vswscanf)
+#   else
 __LDBL_REDIR1_DECL (vfwscanf, __nldbl___isoc99_vfwscanf)
 __LDBL_REDIR1_DECL (vwscanf, __nldbl___isoc99_vwscanf)
 __LDBL_REDIR1_DECL (vswscanf, __nldbl___isoc99_vswscanf)
+#   endif
 #  elif __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+#   if __GLIBC_USE (C2X_STRTOL)
+__LDBL_REDIR1_DECL (vfwscanf, __isoc23_vfwscanfieee128)
+__LDBL_REDIR1_DECL (vwscanf, __isoc23_vwscanfieee128)
+__LDBL_REDIR1_DECL (vswscanf, __isoc23_vswscanfieee128)
+#   else
 __LDBL_REDIR1_DECL (vfwscanf, __isoc99_vfwscanfieee128)
 __LDBL_REDIR1_DECL (vwscanf, __isoc99_vwscanfieee128)
 __LDBL_REDIR1_DECL (vswscanf, __isoc99_vswscanfieee128)
+#   endif
 #  else
 #   error bits/stdlib-ldbl.h included when no ldbl redirections are required.
 #  endif
diff --git a/wcsmbs/isoc23_fwscanf.c b/wcsmbs/isoc23_fwscanf.c
new file mode 100644
index 0000000000..90499bb098
--- /dev/null
+++ b/wcsmbs/isoc23_fwscanf.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1991-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 <libioP.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+/* Read formatted input from STREAM according to the format string FORMAT.  */
+int
+__isoc23_fwscanf (FILE *stream, const wchar_t *format, ...)
+{
+  va_list arg;
+  int done;
+
+  va_start (arg, format);
+  done = __vfwscanf_internal (stream, format, arg,
+			      SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
+  va_end (arg);
+
+  return done;
+}
diff --git a/wcsmbs/isoc23_swscanf.c b/wcsmbs/isoc23_swscanf.c
new file mode 100644
index 0000000000..75021a0657
--- /dev/null
+++ b/wcsmbs/isoc23_swscanf.c
@@ -0,0 +1,38 @@
+/* Copyright (C) 1991-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 <stdarg.h>
+#include <libio/strfile.h>
+
+/* Read formatted input from S, according to the format string FORMAT.  */
+
+int
+__isoc23_swscanf (const wchar_t *s, const wchar_t *format, ...)
+{
+  va_list arg;
+  int done;
+  _IO_strfile sf;
+  struct _IO_wide_data wd;
+  FILE *f = _IO_strfile_readw (&sf, &wd, s);
+
+  va_start (arg, format);
+  done = __vfwscanf_internal (f, format, arg,
+			      SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
+  va_end (arg);
+
+  return done;
+}
diff --git a/wcsmbs/isoc23_vfwscanf.c b/wcsmbs/isoc23_vfwscanf.c
new file mode 100644
index 0000000000..6134a84b2e
--- /dev/null
+++ b/wcsmbs/isoc23_vfwscanf.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1991-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 <libioP.h>
+#include <stdio.h>
+#include <wchar.h>
+
+/* Read formatted input from STREAM according to the format string FORMAT.  */
+int
+__isoc23_vfwscanf (FILE *stream, const wchar_t *format, va_list args)
+{
+  return __vfwscanf_internal (stream, format, args,
+			      SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
+}
+libc_hidden_def (__isoc23_vfwscanf)
diff --git a/wcsmbs/isoc23_vswscanf.c b/wcsmbs/isoc23_vswscanf.c
new file mode 100644
index 0000000000..77c0e97986
--- /dev/null
+++ b/wcsmbs/isoc23_vswscanf.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1993-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 <wchar.h>
+#include <libio/strfile.h>
+
+int
+__isoc23_vswscanf (const wchar_t *string, const wchar_t *format, va_list args)
+{
+  _IO_strfile sf;
+  struct _IO_wide_data wd;
+  FILE *f = _IO_strfile_readw (&sf, &wd, string);
+  return __vfwscanf_internal (f, format, args,
+			      SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
+}
+libc_hidden_def (__isoc23_vswscanf)
diff --git a/wcsmbs/isoc23_vwscanf.c b/wcsmbs/isoc23_vwscanf.c
new file mode 100644
index 0000000000..95d929268c
--- /dev/null
+++ b/wcsmbs/isoc23_vwscanf.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1991-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 <libioP.h>
+#include <stdio.h>
+#include <wchar.h>
+
+/* Read formatted input from STDIN according to the format string FORMAT.  */
+int
+__isoc23_vwscanf (const wchar_t *format, va_list args)
+{
+  return __vfwscanf_internal (stdin, format, args,
+			      SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
+}
diff --git a/wcsmbs/isoc23_wscanf.c b/wcsmbs/isoc23_wscanf.c
new file mode 100644
index 0000000000..4fb54438cc
--- /dev/null
+++ b/wcsmbs/isoc23_wscanf.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1991-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 <stdarg.h>
+#include <stdio.h>
+#include <libioP.h>
+#include <wchar.h>
+
+
+/* Read formatted input from stdin according to the format string FORMAT.  */
+int
+__isoc23_wscanf (const wchar_t *format, ...)
+{
+  va_list arg;
+  int done;
+
+  va_start (arg, format);
+  done = __vfwscanf_internal (stdin, format, arg,
+			      SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
+  va_end (arg);
+
+  return done;
+}
diff --git a/wcsmbs/tst-wscanf-binary-c11.c b/wcsmbs/tst-wscanf-binary-c11.c
new file mode 100644
index 0000000000..cd1127ef5e
--- /dev/null
+++ b/wcsmbs/tst-wscanf-binary-c11.c
@@ -0,0 +1,28 @@
+/* Test wscanf 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 FNW w
+#define L_(C) L ## C
+#define TEST_C2X 0
+#define STD "c11"
+
+#include "../stdio-common/tst-scanf-binary-main.c"
diff --git a/wcsmbs/tst-wscanf-binary-c2x.c b/wcsmbs/tst-wscanf-binary-c2x.c
new file mode 100644
index 0000000000..05260b8cfd
--- /dev/null
+++ b/wcsmbs/tst-wscanf-binary-c2x.c
@@ -0,0 +1,31 @@
+/* Test wscanf 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 FNW w
+#define L_(C) L ## C
+#define TEST_C2X 1
+#define STD "c2x"
+
+#include "../stdio-common/tst-scanf-binary-main.c"
diff --git a/wcsmbs/tst-wscanf-binary-gnu11.c b/wcsmbs/tst-wscanf-binary-gnu11.c
new file mode 100644
index 0000000000..4af479e968
--- /dev/null
+++ b/wcsmbs/tst-wscanf-binary-gnu11.c
@@ -0,0 +1,26 @@
+/* Test wscanf functions with C2X binary integers (wide strings,
+   GNU 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/>.  */
+
+#define CHAR wchar_t
+#define FNW w
+#define L_(C) L ## C
+#define TEST_C2X 1
+#define STD "gnu11"
+
+#include "../stdio-common/tst-scanf-binary-main.c"
diff --git a/wcsmbs/tst-wscanf-binary-gnu89.c b/wcsmbs/tst-wscanf-binary-gnu89.c
new file mode 100644
index 0000000000..85226aeef9
--- /dev/null
+++ b/wcsmbs/tst-wscanf-binary-gnu89.c
@@ -0,0 +1,26 @@
+/* Test wscanf functions with C2X binary integers (wide strings,
+   GNU extensions to C89).
+   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 FNW w
+#define L_(C) L ## C
+#define TEST_C2X 0
+#define STD "gnu89"
+
+#include "../stdio-common/tst-scanf-binary-main.c"
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index cde0d32b0a..7ab99ba93b 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -762,9 +762,34 @@ extern int swscanf (const wchar_t *__restrict __s,
    functions are at alternative names.  When __LDBL_COMPAT or
    __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI are in effect, this is handled in
    bits/wchar-ldbl.h.  */
-#if !__GLIBC_USE (DEPRECATED_SCANF) && !defined __LDBL_COMPAT \
+# if !__GLIBC_USE (DEPRECATED_SCANF) && !defined __LDBL_COMPAT \
      && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0
-#  ifdef __REDIRECT
+#  if __GLIBC_USE (C2X_STRTOL)
+#   ifdef __REDIRECT
+extern int __REDIRECT (fwscanf, (__FILE *__restrict __stream,
+				 const wchar_t *__restrict __format, ...),
+		       __isoc23_fwscanf)
+     /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
+extern int __REDIRECT (wscanf, (const wchar_t *__restrict __format, ...),
+		       __isoc23_wscanf)
+     /* __attribute__ ((__format__ (__wscanf__, 1, 2))) */;
+extern int __REDIRECT_NTH (swscanf, (const wchar_t *__restrict __s,
+				     const wchar_t *__restrict __format,
+				     ...), __isoc23_swscanf)
+     /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
+#   else
+extern int __isoc23_fwscanf (__FILE *__restrict __stream,
+			     const wchar_t *__restrict __format, ...);
+extern int __isoc23_wscanf (const wchar_t *__restrict __format, ...);
+extern int __isoc23_swscanf (const wchar_t *__restrict __s,
+			     const wchar_t *__restrict __format, ...)
+     __THROW;
+#    define fwscanf __isoc23_fwscanf
+#    define wscanf __isoc23_wscanf
+#    define swscanf __isoc23_swscanf
+#   endif
+#  else
+#   ifdef __REDIRECT
 extern int __REDIRECT (fwscanf, (__FILE *__restrict __stream,
 				 const wchar_t *__restrict __format, ...),
 		       __isoc99_fwscanf)
@@ -776,16 +801,17 @@ extern int __REDIRECT_NTH (swscanf, (const wchar_t *__restrict __s,
 				     const wchar_t *__restrict __format,
 				     ...), __isoc99_swscanf)
      /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
-#  else
+#   else
 extern int __isoc99_fwscanf (__FILE *__restrict __stream,
 			     const wchar_t *__restrict __format, ...);
 extern int __isoc99_wscanf (const wchar_t *__restrict __format, ...);
 extern int __isoc99_swscanf (const wchar_t *__restrict __s,
 			     const wchar_t *__restrict __format, ...)
      __THROW;
-#   define fwscanf __isoc99_fwscanf
-#   define wscanf __isoc99_wscanf
-#   define swscanf __isoc99_swscanf
+#    define fwscanf __isoc99_fwscanf
+#    define wscanf __isoc99_wscanf
+#    define swscanf __isoc99_swscanf
+#   endif
 #  endif
 # endif
 
@@ -818,7 +844,34 @@ extern int vswscanf (const wchar_t *__restrict __s,
      && (!defined __LDBL_COMPAT || !defined __REDIRECT) \
      && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K) \
      && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0
-#  ifdef __REDIRECT
+#  if __GLIBC_USE (C2X_STRTOL)
+#   ifdef __REDIRECT
+extern int __REDIRECT (vfwscanf, (__FILE *__restrict __s,
+				  const wchar_t *__restrict __format,
+				  __gnuc_va_list __arg), __isoc23_vfwscanf)
+     /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
+extern int __REDIRECT (vwscanf, (const wchar_t *__restrict __format,
+				 __gnuc_va_list __arg), __isoc23_vwscanf)
+     /* __attribute__ ((__format__ (__wscanf__, 1, 0))) */;
+extern int __REDIRECT_NTH (vswscanf, (const wchar_t *__restrict __s,
+				      const wchar_t *__restrict __format,
+				      __gnuc_va_list __arg), __isoc23_vswscanf)
+     /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
+#   else
+extern int __isoc23_vfwscanf (__FILE *__restrict __s,
+			      const wchar_t *__restrict __format,
+			      __gnuc_va_list __arg);
+extern int __isoc23_vwscanf (const wchar_t *__restrict __format,
+			     __gnuc_va_list __arg);
+extern int __isoc23_vswscanf (const wchar_t *__restrict __s,
+			      const wchar_t *__restrict __format,
+			      __gnuc_va_list __arg) __THROW;
+#    define vfwscanf __isoc23_vfwscanf
+#    define vwscanf __isoc23_vwscanf
+#    define vswscanf __isoc23_vswscanf
+#   endif
+#  else
+#   ifdef __REDIRECT
 extern int __REDIRECT (vfwscanf, (__FILE *__restrict __s,
 				  const wchar_t *__restrict __format,
 				  __gnuc_va_list __arg), __isoc99_vfwscanf)
@@ -830,7 +883,7 @@ extern int __REDIRECT_NTH (vswscanf, (const wchar_t *__restrict __s,
 				      const wchar_t *__restrict __format,
 				      __gnuc_va_list __arg), __isoc99_vswscanf)
      /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
-#  else
+#   else
 extern int __isoc99_vfwscanf (__FILE *__restrict __s,
 			      const wchar_t *__restrict __format,
 			      __gnuc_va_list __arg);
@@ -839,9 +892,10 @@ extern int __isoc99_vwscanf (const wchar_t *__restrict __format,
 extern int __isoc99_vswscanf (const wchar_t *__restrict __s,
 			      const wchar_t *__restrict __format,
 			      __gnuc_va_list __arg) __THROW;
-#   define vfwscanf __isoc99_vfwscanf
-#   define vwscanf __isoc99_vwscanf
-#   define vswscanf __isoc99_vswscanf
+#    define vfwscanf __isoc99_vfwscanf
+#    define vwscanf __isoc99_vwscanf
+#    define vswscanf __isoc99_vswscanf
+#   endif
 #  endif
 # endif