From: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>
To: Joseph Myers <joseph@codesourcery.com>, libc-alpha@sourceware.org
Subject: Re: [v2] C2x scanf binary constant handling
Date: Mon, 20 Feb 2023 17:03:13 -0300 [thread overview]
Message-ID: <f7a80d15-6c06-8db1-de8f-3669a4cc6612@linaro.org> (raw)
In-Reply-To: <a1cfb7e8-d819-74ef-1ee7-82d135dcbedc@codesourcery.com>
On 16/02/23 20:40, Joseph Myers wrote:
> C2x adds binary integer constants starting with 0b or 0B, and supports
> those constants for the %i scanf format (in addition to the %b format,
> which isn't yet implemented for scanf in glibc). Implement that scanf
> support for glibc.
>
> As with the strtol support, this is incompatible with previous C
> standard versions, in that such an input string starting with 0b or 0B
> was previously required to be parsed as 0 (with the rest of the input
> potentially matching subsequent parts of the scanf format string).
> Thus this patch adds 12 new __isoc23_* functions per long double
> format (12, 24 or 36 depending on how many long double formats the
> glibc configuration supports), with appropriate header redirection
> support (generally very closely following that for the __isoc99_*
> scanf functions - note that __GLIBC_USE (DEPRECATED_SCANF) takes
> precedence over __GLIBC_USE (C2X_STRTOL), so the case of GNU
> extensions to C89 continues to get old-style GNU %a and does not get
> this new feature). The function names would remain as __isoc23_* even
> if C2x ends up published in 2024 rather than 2023.
>
> When scanf %b support is added, I think it will be appropriate for all
> versions of scanf to follow C2x rules for inputs to the %b format
> (given that there are no compatibility concerns for a new format).
>
> Tested for x86_64 (full glibc testsuite). The previous version was
> also tested for powerpc (32-bit) and powerpc64le (stdio-common/ and
> wcsmbs/ tests), and with build-many-glibcs.py.
>
> ---
>
> v2 has updated symbol versions and copyright years and applies to
> current glibc, which now has the strtol changes.
LGTM, just minor style issues below regarding the Makefiles and the test
skeleton.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> diff --git a/NEWS b/NEWS
> index 080a2060d4..e54d734600 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -14,7 +14,10 @@ Major new features:
> input: strtol, strtoll, strtoul, strtoull, strtol_l, strtoll_l,
> strtoul_l, strtoull_l, strtoimax, strtoumax, strtoq, strtouq, wcstol,
> wcstoll, wcstoul, wcstoull, wcstol_l, wcstoll_l, wcstoul_l,
> - wcstoull_l, wcstoimax, wcstoumax, wcstoq, wcstouq.
> + wcstoull_l, wcstoimax, wcstoumax, wcstoq, wcstouq. Similarly, the
> + following functions support binary integers prefixed by 0b or 0B as
> + input to the %i format: fscanf, scanf, sscanf, vscanf, vsscanf,
> + vfscanf, fwscanf, wscanf, swscanf, vfwscanf, vwscanf, vswscanf.
>
> Deprecated and removed features, and other changes affecting compatibility:
>
Ok.
> diff --git a/include/stdio.h b/include/stdio.h
> index c3e772ad9a..da47d1ce99 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -94,18 +94,34 @@ extern int __isoc99_vscanf (const char *__restrict __format,
> extern int __isoc99_vsscanf (const char *__restrict __s,
> const char *__restrict __format,
> __gnuc_va_list __arg) __THROW;
> +extern int __isoc23_fscanf (FILE *__restrict __stream,
> + const char *__restrict __format, ...) __wur;
> +extern int __isoc23_scanf (const char *__restrict __format, ...) __wur;
> +extern int __isoc23_sscanf (const char *__restrict __s,
> + const char *__restrict __format, ...) __THROW;
> +extern int __isoc23_vfscanf (FILE *__restrict __s,
> + const char *__restrict __format,
> + __gnuc_va_list __arg) __wur;
> +extern int __isoc23_vscanf (const char *__restrict __format,
> + __gnuc_va_list __arg) __wur;
> +extern int __isoc23_vsscanf (const char *__restrict __s,
> + const char *__restrict __format,
> + __gnuc_va_list __arg) __THROW;
>
> libc_hidden_proto (__isoc99_sscanf)
> libc_hidden_proto (__isoc99_vsscanf)
> libc_hidden_proto (__isoc99_vfscanf)
> +libc_hidden_proto (__isoc23_sscanf)
> +libc_hidden_proto (__isoc23_vsscanf)
> +libc_hidden_proto (__isoc23_vfscanf)
>
> -/* Internal uses of sscanf should call the C99-compliant version.
> +/* Internal uses of sscanf should call the C2X-compliant version.
> Unfortunately, symbol redirection is not transitive, so the
> __REDIRECT in the public header does not link up with the above
> libc_hidden_proto. Bridge the gap with a macro. */
> # if !__GLIBC_USE (DEPRECATED_SCANF)
> # undef sscanf
> -# define sscanf __isoc99_sscanf
> +# define sscanf __isoc23_sscanf
> # endif
>
> # if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1 && IS_IN (libc)
> @@ -114,12 +130,21 @@ libc_hidden_proto (__isoc99_vfscanf)
> extern __typeof (__isoc99_sscanf) ___ieee128_isoc99_sscanf __THROW;
> extern __typeof (__isoc99_vsscanf) ___ieee128_isoc99_vsscanf __THROW;
> extern __typeof (__isoc99_vfscanf) ___ieee128_isoc99_vfscanf __THROW;
> +extern __typeof (__isoc23_sscanf) ___ieee128_isoc23_sscanf __THROW;
> +extern __typeof (__isoc23_vsscanf) ___ieee128_isoc23_vsscanf __THROW;
> +extern __typeof (__isoc23_vfscanf) ___ieee128_isoc23_vfscanf __THROW;
> libc_hidden_proto (___ieee128_isoc99_sscanf)
> libc_hidden_proto (___ieee128_isoc99_vsscanf)
> libc_hidden_proto (___ieee128_isoc99_vfscanf)
> +libc_hidden_proto (___ieee128_isoc23_sscanf)
> +libc_hidden_proto (___ieee128_isoc23_vsscanf)
> +libc_hidden_proto (___ieee128_isoc23_vfscanf)
> #define __isoc99_sscanf ___ieee128_isoc99_sscanf
> #define __isoc99_vsscanf ___ieee128_isoc99_vsscanf
> #define __isoc99_vfscanf ___ieee128_isoc99_vfscanf
> +#define __isoc23_sscanf ___ieee128_isoc23_sscanf
> +#define __isoc23_vsscanf ___ieee128_isoc23_vsscanf
> +#define __isoc23_vfscanf ___ieee128_isoc23_vfscanf
> # endif
>
> /* Prototypes for compatibility functions. */
Ok.
> diff --git a/include/wchar.h b/include/wchar.h
> index ea7888f605..fafe7c8e9b 100644
> --- a/include/wchar.h
> +++ b/include/wchar.h
> @@ -288,8 +288,24 @@ 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;
> +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;
> +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;
> libc_hidden_proto (__isoc99_vswscanf)
> libc_hidden_proto (__isoc99_vfwscanf)
> +libc_hidden_proto (__isoc23_vswscanf)
> +libc_hidden_proto (__isoc23_vfwscanf)
>
> /* Internal functions. */
> extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,
Ok.
> diff --git a/libio/bits/stdio-ldbl.h b/libio/bits/stdio-ldbl.h
> index b54d00b68b..ed68fc4e28 100644
> --- a/libio/bits/stdio-ldbl.h
> +++ b/libio/bits/stdio-ldbl.h
> @@ -28,13 +28,25 @@ __LDBL_REDIR_DECL (vprintf)
> __LDBL_REDIR_DECL (vsprintf)
> #if !__GLIBC_USE (DEPRECATED_SCANF)
> # if defined __LDBL_COMPAT
> +# if __GLIBC_USE (C2X_STRTOL)
> +__LDBL_REDIR1_DECL (fscanf, __nldbl___isoc23_fscanf)
> +__LDBL_REDIR1_DECL (scanf, __nldbl___isoc23_scanf)
> +__LDBL_REDIR1_DECL (sscanf, __nldbl___isoc23_sscanf)
> +# else
> __LDBL_REDIR1_DECL (fscanf, __nldbl___isoc99_fscanf)
> __LDBL_REDIR1_DECL (scanf, __nldbl___isoc99_scanf)
> __LDBL_REDIR1_DECL (sscanf, __nldbl___isoc99_sscanf)
> +# endif
> # elif __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
> +# if __GLIBC_USE (C2X_STRTOL)
> +__LDBL_REDIR1_DECL (fscanf, __isoc23_fscanfieee128)
> +__LDBL_REDIR1_DECL (scanf, __isoc23_scanfieee128)
> +__LDBL_REDIR1_DECL (sscanf, __isoc23_sscanfieee128)
> +# else
> __LDBL_REDIR1_DECL (fscanf, __isoc99_fscanfieee128)
> __LDBL_REDIR1_DECL (scanf, __isoc99_scanfieee128)
> __LDBL_REDIR1_DECL (sscanf, __isoc99_sscanfieee128)
> +# endif
> # else
> # error bits/stdlib-ldbl.h included when no ldbl redirections are required.
> # endif
> @@ -52,13 +64,25 @@ __LDBL_REDIR_DECL (vsnprintf)
> #ifdef __USE_ISOC99
> # if !__GLIBC_USE (DEPRECATED_SCANF)
> # if defined __LDBL_COMPAT
> +# if __GLIBC_USE (C2X_STRTOL)
> +__LDBL_REDIR1_DECL (vfscanf, __nldbl___isoc23_vfscanf)
> +__LDBL_REDIR1_DECL (vscanf, __nldbl___isoc23_vscanf)
> +__LDBL_REDIR1_DECL (vsscanf, __nldbl___isoc23_vsscanf)
> +# else
> __LDBL_REDIR1_DECL (vfscanf, __nldbl___isoc99_vfscanf)
> __LDBL_REDIR1_DECL (vscanf, __nldbl___isoc99_vscanf)
> __LDBL_REDIR1_DECL (vsscanf, __nldbl___isoc99_vsscanf)
> +# endif
> # elif __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
> +# if __GLIBC_USE (C2X_STRTOL)
> +__LDBL_REDIR1_DECL (vfscanf, __isoc23_vfscanfieee128)
> +__LDBL_REDIR1_DECL (vscanf, __isoc23_vscanfieee128)
> +__LDBL_REDIR1_DECL (vsscanf, __isoc23_vsscanfieee128)
> +# else
> __LDBL_REDIR1_DECL (vfscanf, __isoc99_vfscanfieee128)
> __LDBL_REDIR1_DECL (vscanf, __isoc99_vscanfieee128)
> __LDBL_REDIR1_DECL (vsscanf, __isoc99_vsscanfieee128)
> +# endif
> # else
> # error bits/stdlib-ldbl.h included when no ldbl redirections are required.
> # endif
Ok.
> diff --git a/libio/libioP.h b/libio/libioP.h
> index a5f00822ab..38507388fd 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
> @@ -781,6 +781,9 @@ extern off64_t _IO_seekpos_unlocked (FILE *, off64_t, int)
> functions use. When the flag is set to zero, automatic allocation is
> enabled.
>
> + SCANF_ISOC23_BIN_CST, when set to one, indicates the %i accepts
> + binary constants starting 0b or 0B.
> +
> SCANF_LDBL_USES_FLOAT128 is used on platforms where the long double
> format used to be different from the IEC 60559 double format *and*
> also different from the Quadruple 128-bits IEC 60559 format (such as
> @@ -793,7 +796,8 @@ extern off64_t _IO_seekpos_unlocked (FILE *, off64_t, int)
> as the previous format on that platform. */
> #define SCANF_LDBL_IS_DBL 0x0001
> #define SCANF_ISOC99_A 0x0002
> -#define SCANF_LDBL_USES_FLOAT128 0x0004
> +#define SCANF_ISOC23_BIN_CST 0x0004
> +#define SCANF_LDBL_USES_FLOAT128 0x0008
>
> extern int __vfscanf_internal (FILE *fp, const char *format, va_list argp,
> unsigned int flags)
Ok.
> diff --git a/libio/stdio.h b/libio/stdio.h
> index ed80420a2b..857f02888d 100644
> --- a/libio/stdio.h
> +++ b/libio/stdio.h
> @@ -430,7 +430,28 @@ extern int sscanf (const char *__restrict __s,
> #include <bits/floatn.h>
> #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 (fscanf, (FILE *__restrict __stream,
> + const char *__restrict __format, ...),
> + __isoc23_fscanf) __wur;
> +extern int __REDIRECT (scanf, (const char *__restrict __format, ...),
> + __isoc23_scanf) __wur;
> +extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s,
> + const char *__restrict __format, ...),
> + __isoc23_sscanf);
> +# else
> +extern int __isoc23_fscanf (FILE *__restrict __stream,
> + const char *__restrict __format, ...) __wur;
> +extern int __isoc23_scanf (const char *__restrict __format, ...) __wur;
> +extern int __isoc23_sscanf (const char *__restrict __s,
> + const char *__restrict __format, ...) __THROW;
> +# define fscanf __isoc23_fscanf
> +# define scanf __isoc23_scanf
> +# define sscanf __isoc23_sscanf
> +# endif
> +# else
> +# ifdef __REDIRECT
> extern int __REDIRECT (fscanf, (FILE *__restrict __stream,
> const char *__restrict __format, ...),
> __isoc99_fscanf) __wur;
> @@ -439,15 +460,16 @@ extern int __REDIRECT (scanf, (const char *__restrict __format, ...),
> extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s,
> const char *__restrict __format, ...),
> __isoc99_sscanf);
> -# else
> +# else
> extern int __isoc99_fscanf (FILE *__restrict __stream,
> const char *__restrict __format, ...) __wur;
> extern int __isoc99_scanf (const char *__restrict __format, ...) __wur;
> extern int __isoc99_sscanf (const char *__restrict __s,
> const char *__restrict __format, ...) __THROW;
> -# define fscanf __isoc99_fscanf
> -# define scanf __isoc99_scanf
> -# define sscanf __isoc99_sscanf
> +# define fscanf __isoc99_fscanf
> +# define scanf __isoc99_scanf
> +# define sscanf __isoc99_sscanf
> +# endif
> # endif
> #endif
>
Ok.
> @@ -474,7 +496,37 @@ extern int vsscanf (const char *__restrict __s,
>
> /* Same redirection as above for the v*scanf family. */
> # if !__GLIBC_USE (DEPRECATED_SCANF)
> -# if defined __REDIRECT && !defined __LDBL_COMPAT \
> +# if __GLIBC_USE (C2X_STRTOL)
> +# if defined __REDIRECT && !defined __LDBL_COMPAT \
> + && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0
> +extern int __REDIRECT (vfscanf,
> + (FILE *__restrict __s,
> + const char *__restrict __format, __gnuc_va_list __arg),
> + __isoc23_vfscanf)
> + __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
> +extern int __REDIRECT (vscanf, (const char *__restrict __format,
> + __gnuc_va_list __arg), __isoc23_vscanf)
> + __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
> +extern int __REDIRECT_NTH (vsscanf,
> + (const char *__restrict __s,
> + const char *__restrict __format,
> + __gnuc_va_list __arg), __isoc23_vsscanf)
> + __attribute__ ((__format__ (__scanf__, 2, 0)));
> +# elif !defined __REDIRECT
> +extern int __isoc23_vfscanf (FILE *__restrict __s,
> + const char *__restrict __format,
> + __gnuc_va_list __arg) __wur;
> +extern int __isoc23_vscanf (const char *__restrict __format,
> + __gnuc_va_list __arg) __wur;
> +extern int __isoc23_vsscanf (const char *__restrict __s,
> + const char *__restrict __format,
> + __gnuc_va_list __arg) __THROW;
> +# define vfscanf __isoc23_vfscanf
> +# define vscanf __isoc23_vscanf
> +# define vsscanf __isoc23_vsscanf
> +# endif
> +# else
> +# if defined __REDIRECT && !defined __LDBL_COMPAT \
> && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0
> extern int __REDIRECT (vfscanf,
> (FILE *__restrict __s,
> @@ -489,7 +541,7 @@ extern int __REDIRECT_NTH (vsscanf,
> const char *__restrict __format,
> __gnuc_va_list __arg), __isoc99_vsscanf)
> __attribute__ ((__format__ (__scanf__, 2, 0)));
> -# elif !defined __REDIRECT
> +# elif !defined __REDIRECT
> extern int __isoc99_vfscanf (FILE *__restrict __s,
> const char *__restrict __format,
> __gnuc_va_list __arg) __wur;
> @@ -498,9 +550,10 @@ extern int __isoc99_vscanf (const char *__restrict __format,
> extern int __isoc99_vsscanf (const char *__restrict __s,
> const char *__restrict __format,
> __gnuc_va_list __arg) __THROW;
> -# define vfscanf __isoc99_vfscanf
> -# define vscanf __isoc99_vscanf
> -# define vsscanf __isoc99_vsscanf
> +# define vfscanf __isoc99_vfscanf
> +# define vscanf __isoc99_vscanf
> +# define vsscanf __isoc99_vsscanf
> +# endif
> # endif
> # endif
> #endif /* Use ISO C9x. */
Ok.
> diff --git a/manual/stdio.texi b/manual/stdio.texi
> index d7eab1843a..e86aa5933b 100644
> --- a/manual/stdio.texi
> +++ b/manual/stdio.texi
> @@ -3624,7 +3624,8 @@ constant. The syntax that is recognized is the same as that for the
> @code{strtol} function (@pxref{Parsing of Integers}) with the value
> @code{0} for the @var{base} argument. (You can print integers in this
> syntax with @code{printf} by using the @samp{#} flag character with the
> -@samp{%x}, @samp{%o}, or @samp{%d} conversion. @xref{Integer Conversions}.)
> +@samp{%x}, @samp{%o}, @samp{%b}, or @samp{%d} conversion.
> +@xref{Integer Conversions}.)
>
> For example, any of the strings @samp{10}, @samp{0xa}, or @samp{012}
> could be read in as integers under the @samp{%i} conversion. Each of
Ok.
> diff --git a/stdio-common/Makefile b/stdio-common/Makefile
> index 92a3499a94..a14ee487ea 100644
> --- a/stdio-common/Makefile
> +++ b/stdio-common/Makefile
> @@ -47,6 +47,12 @@ routines := \
> isoc99_vfscanf \
> isoc99_vscanf \
> isoc99_vsscanf \
> + isoc23_fscanf \
> + isoc23_scanf \
> + isoc23_sscanf \
> + isoc23_vfscanf \
> + isoc23_vscanf \
> + isoc23_vsscanf \
> itoa-digits \
> itoa-udigits \
> itowa-digits \
> @@ -214,6 +220,10 @@ tests := \
> tst-put-error \
> tst-renameat2 \
> tst-rndseek \
> + tst-scanf-binary-c11 \
> + tst-scanf-binary-c2x \
> + tst-scanf-binary-gnu11 \
> + tst-scanf-binary-gnu89 \
> tst-scanf-round \
> tst-setvbuf1 \
> tst-sprintf \
Ok.
> @@ -415,6 +425,10 @@ CFLAGS-isoc99_vfscanf.c += -fexceptions
> CFLAGS-isoc99_vscanf.c += -fexceptions
> CFLAGS-isoc99_fscanf.c += -fexceptions
> CFLAGS-isoc99_scanf.c += -fexceptions
> +CFLAGS-isoc23_vfscanf.c += -fexceptions
> +CFLAGS-isoc23_vscanf.c += -fexceptions
> +CFLAGS-isoc23_fscanf.c += -fexceptions
> +CFLAGS-isoc23_scanf.c += -fexceptions
>
> CFLAGS-dprintf.c += $(config-cflags-wno-ignored-attributes)
>
> @@ -440,6 +454,14 @@ CFLAGS-tst-bz11319-fortify2.c += -D_FORTIFY_SOURCE=2
>
> CFLAGS-tst-memstream-string.c += -fno-builtin-fprintf
>
> +# Some versions of GCC supported for building glibc do not support -std=c2x, so
> +# the test for that version uses -std=c11 and then _ISOC2X_SOURCE is defined in
> +# the test as needed.
> +CFLAGS-tst-scanf-binary-c11.c += -std=c11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-scanf-binary-c2x.c += -std=c11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-scanf-binary-gnu11.c += -std=gnu11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-scanf-binary-gnu89.c += -std=gnu89 -DOBJPFX=\"$(objpfx)\"
> +
> CPPFLAGS += $(libio-mtsafe)
>
> $(objpfx)tst-setvbuf1.out: /dev/null $(objpfx)tst-setvbuf1
Ok.
> diff --git a/stdio-common/Versions b/stdio-common/Versions
> index 522f302198..4bcfc3fb41 100644
> --- a/stdio-common/Versions
> +++ b/stdio-common/Versions
> @@ -63,6 +63,14 @@ libc {
> GLIBC_2.29 {
> # SHLIB_COMPAT(GLIBC_2_0, GLIBC_2_29) used in iovfscanf.c etc.
> }
> + GLIBC_2.38 {
> + __isoc23_scanf;
> + __isoc23_vscanf;
> + __isoc23_fscanf;
> + __isoc23_vfscanf;
> + __isoc23_sscanf;
> + __isoc23_vsscanf;
> + }
> GLIBC_PRIVATE {
> # global variables
> _itoa_lower_digits;
Ok.
> diff --git a/stdio-common/isoc23_fscanf.c b/stdio-common/isoc23_fscanf.c
> new file mode 100644
> index 0000000000..dc19f57bec
> --- /dev/null
> +++ b/stdio-common/isoc23_fscanf.c
> @@ -0,0 +1,35 @@
> +/* 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>
> +
> +/* Read formatted input from STREAM according to the format string FORMAT. */
> +int
> +__isoc23_fscanf (FILE *stream, const char *format, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, format);
> + done = __vfscanf_internal (stream, format, arg,
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/stdio-common/isoc23_scanf.c b/stdio-common/isoc23_scanf.c
> new file mode 100644
> index 0000000000..22b5aaebda
> --- /dev/null
> +++ b/stdio-common/isoc23_scanf.c
> @@ -0,0 +1,35 @@
> +/* 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>
> +
> +/* Read formatted input from stdin according to the format string FORMAT. */
> +int
> +__isoc23_scanf (const char *format, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, format);
> + done = __vfscanf_internal (stdin, format, arg,
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/stdio-common/isoc23_sscanf.c b/stdio-common/isoc23_sscanf.c
> new file mode 100644
> index 0000000000..1da4c53846
> --- /dev/null
> +++ b/stdio-common/isoc23_sscanf.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 <libio/strfile.h>
> +
> +/* Read formatted input from S, according to the format string FORMAT. */
> +int
> +__isoc23_sscanf (const char *s, const char *format, ...)
> +{
> + va_list arg;
> + int done;
> + _IO_strfile sf;
> + FILE *f = _IO_strfile_read (&sf, s);
> +
> + va_start (arg, format);
> + done = __vfscanf_internal (f, format, arg,
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> +libc_hidden_def (__isoc23_sscanf)
> diff --git a/stdio-common/isoc23_vfscanf.c b/stdio-common/isoc23_vfscanf.c
> new file mode 100644
> index 0000000000..d1411a2d65
> --- /dev/null
> +++ b/stdio-common/isoc23_vfscanf.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>
> +
> +/* Read formatted input from STREAM according to the format string FORMAT. */
> +int
> +__isoc23_vfscanf (FILE *stream, const char *format, va_list args)
> +{
> + return __vfscanf_internal (stream, format, args,
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
> +}
> +libc_hidden_def (__isoc23_vfscanf)
Ok.
> diff --git a/stdio-common/isoc23_vscanf.c b/stdio-common/isoc23_vscanf.c
> new file mode 100644
> index 0000000000..81be184c3b
> --- /dev/null
> +++ b/stdio-common/isoc23_vscanf.c
> @@ -0,0 +1,27 @@
> +/* 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>
> +
> +/* Read formatted input from STDIN according to the format string FORMAT. */
> +int
> +__isoc23_vscanf (const char *format, va_list args)
> +{
> + return __vfscanf_internal (stdin, format, args,
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
> +}
Ok.
> diff --git a/stdio-common/isoc23_vsscanf.c b/stdio-common/isoc23_vsscanf.c
> new file mode 100644
> index 0000000000..6cc9a89edc
> --- /dev/null
> +++ b/stdio-common/isoc23_vsscanf.c
> @@ -0,0 +1,28 @@
> +/* 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 <libio/strfile.h>
> +
> +int
> +__isoc23_vsscanf (const char *string, const char *format, va_list args)
> +{
> + _IO_strfile sf;
> + FILE *f = _IO_strfile_read (&sf, string);
> + return __vfscanf_internal (f, format, args,
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
> +}
> +libc_hidden_def (__isoc23_vsscanf)
Ok.
> diff --git a/stdio-common/tst-scanf-binary-c11.c b/stdio-common/tst-scanf-binary-c11.c
> new file mode 100644
> index 0000000000..1869bb6881
> --- /dev/null
> +++ b/stdio-common/tst-scanf-binary-c11.c
> @@ -0,0 +1,28 @@
> +/* Test scanf functions with C2X binary integers (narrow 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 char
> +#define FNW
> +#define L_(C) C
> +#define TEST_C2X 0
> +#define STD "c11"
> +
> +#include <tst-scanf-binary-main.c>
Ok.
> diff --git a/stdio-common/tst-scanf-binary-c2x.c b/stdio-common/tst-scanf-binary-c2x.c
> new file mode 100644
> index 0000000000..6033b1f375
> --- /dev/null
> +++ b/stdio-common/tst-scanf-binary-c2x.c
> @@ -0,0 +1,31 @@
> +/* Test scanf functions with C2X binary integers (narrow 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 char
> +#define FNW
> +#define L_(C) C
> +#define TEST_C2X 1
> +#define STD "c2x"
> +
> +#include <tst-scanf-binary-main.c>
Ok.
> diff --git a/stdio-common/tst-scanf-binary-gnu11.c b/stdio-common/tst-scanf-binary-gnu11.c
> new file mode 100644
> index 0000000000..4bd49700d7
> --- /dev/null
> +++ b/stdio-common/tst-scanf-binary-gnu11.c
> @@ -0,0 +1,26 @@
> +/* Test scanf functions with C2X binary integers (narrow 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 char
> +#define FNW
> +#define L_(C) C
> +#define TEST_C2X 1
> +#define STD "gnu11"
> +
> +#include <tst-scanf-binary-main.c>
Ok.
> diff --git a/stdio-common/tst-scanf-binary-gnu89.c b/stdio-common/tst-scanf-binary-gnu89.c
> new file mode 100644
> index 0000000000..5325732f7c
> --- /dev/null
> +++ b/stdio-common/tst-scanf-binary-gnu89.c
> @@ -0,0 +1,26 @@
> +/* Test scanf functions with C2X binary integers (narrow 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 char
> +#define FNW
> +#define L_(C) C
> +#define TEST_C2X 0
> +#define STD "gnu89"
> +
> +#include <tst-scanf-binary-main.c>
Ok.
> diff --git a/stdio-common/tst-scanf-binary-main.c b/stdio-common/tst-scanf-binary-main.c
> new file mode 100644
> index 0000000000..858283843e
> --- /dev/null
> +++ b/stdio-common/tst-scanf-binary-main.c
> @@ -0,0 +1,208 @@
> +/* Test scanf functions with C2X binary integers.
> + 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 <stdarg.h>
> +#include <stdio.h>
> +#include <wchar.h>
> +
> +#include <support/check.h>
> +
> +#define CONCAT_(X, Y, Z) X ## Y ## Z
> +#define CONCAT(X, Y, Z) CONCAT_ (X, Y, Z)
> +#define FNX(FN1, FN2) CONCAT (FN1, FNW, FN2)
> +#ifndef STDX
> +# define STDX ""
> +#endif
> +
> +#define INFILE OBJPFX "/tst-" STDX "scanf-binary-" STD "-in"
> +
> +static int
> +wrap_vfscanf (FILE *fp, const CHAR *format, ...)
> +{
> + va_list ap;
> + va_start (ap, format);
> + int ret = FNX (vf, scanf) (fp, format, ap);
> + va_end (ap);
> + return ret;
> +}
> +
> +static int
> +wrap_vscanf (const CHAR *format, ...)
> +{
> + va_list ap;
> + va_start (ap, format);
> + int ret = FNX (v, scanf) (format, ap);
> + va_end (ap);
> + return ret;
> +}
> +
> +static int
> +wrap_vsscanf (const CHAR *s, const CHAR *format, ...)
> +{
> + va_list ap;
> + va_start (ap, format);
> + int ret = FNX (vs, scanf) (s, format, ap);
> + va_end (ap);
> + return ret;
> +}
> +
> +static void
> +one_check (const CHAR *s, int expected, char expected_c)
> +{
> + int ret;
> + FILE *fp;
> + int ret_i;
> + long int ret_l;
> + long long int ret_ll;
> + char ret_c;
> + fp = fopen (INFILE, "w");
> + TEST_VERIFY_EXIT (fp != NULL);
Use xfopen, same for other occurances below.
> + ret = FNX (fput, s) (s, fp);
> + TEST_VERIFY_EXIT (0 <= ret);
> + ret = fclose (fp);
> + TEST_VERIFY_EXIT (ret == 0);
Use xfclose, same for other occurances below.
> +
> + if (!TEST_C2X)
> + {
> + expected = 0;
> + expected_c = s[0] == L_('-') ? s[2] : s[1];
> + }
> +
> + ret = FNX (s, scanf) (s, L_("%i %c"), &ret_i, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_i, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + fp = fopen (INFILE, "r");
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = FNX (f, scanf) (fp, L_("%i %c"), &ret_i, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_i, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = fclose (fp);
> + TEST_VERIFY_EXIT (ret == 0);
> + fp = freopen (INFILE, "r", stdin);
> + TEST_VERIFY_EXIT (fp != NULL);
Maybe add xfreopen?
> + ret = FNX (, scanf) (L_("%i %c"), &ret_i, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_i, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = wrap_vsscanf (s, L_("%i %c"), &ret_i, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_i, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + fp = fopen (INFILE, "r");
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = wrap_vfscanf (fp, L_("%i %c"), &ret_i, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_i, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = fclose (fp);
> + TEST_VERIFY_EXIT (ret == 0);
> + fp = freopen (INFILE, "r", stdin);
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = wrap_vscanf (L_("%i %c"), &ret_i, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_i, expected);
> + TEST_COMPARE (ret_c, expected_c);
> +
> + ret = FNX (s, scanf) (s, L_("%li %c"), &ret_l, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_l, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + fp = fopen (INFILE, "r");
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = FNX (f, scanf) (fp, L_("%li %c"), &ret_l, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_l, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = fclose (fp);
> + TEST_VERIFY_EXIT (ret == 0);
> + fp = freopen (INFILE, "r", stdin);
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = FNX (, scanf) (L_("%li %c"), &ret_l, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_l, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = wrap_vsscanf (s, L_("%li %c"), &ret_l, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_l, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + fp = fopen (INFILE, "r");
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = wrap_vfscanf (fp, L_("%li %c"), &ret_l, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_l, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = fclose (fp);
> + TEST_VERIFY_EXIT (ret == 0);
> + fp = freopen (INFILE, "r", stdin);
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = wrap_vscanf (L_("%li %c"), &ret_l, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_l, expected);
> + TEST_COMPARE (ret_c, expected_c);
> +
> + ret = FNX (s, scanf) (s, L_("%lli %c"), &ret_ll, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_ll, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + fp = fopen (INFILE, "r");
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = FNX (f, scanf) (fp, L_("%lli %c"), &ret_ll, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_ll, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = fclose (fp);
> + TEST_VERIFY_EXIT (ret == 0);
> + fp = freopen (INFILE, "r", stdin);
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = FNX (, scanf) (L_("%lli %c"), &ret_ll, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_ll, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = wrap_vsscanf (s, L_("%lli %c"), &ret_ll, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_ll, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + fp = fopen (INFILE, "r");
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = wrap_vfscanf (fp, L_("%lli %c"), &ret_ll, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_ll, expected);
> + TEST_COMPARE (ret_c, expected_c);
> + ret = fclose (fp);
> + TEST_VERIFY_EXIT (ret == 0);
> + fp = freopen (INFILE, "r", stdin);
> + TEST_VERIFY_EXIT (fp != NULL);
> + ret = wrap_vscanf (L_("%lli %c"), &ret_ll, &ret_c);
> + TEST_COMPARE (ret, 2);
> + TEST_COMPARE (ret_ll, expected);
> + TEST_COMPARE (ret_c, expected_c);
> +}
> +
> +static int
> +do_test (void)
> +{
> + one_check (L_("0b101 x"), 5, 'x');
> + one_check (L_("0B101 x"), 5, 'x');
> + one_check (L_("-0b11111 y"), -31, 'y');
> + one_check (L_("-0B11111 y"), -31, 'y');
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
Ok. Should we also add test for ill formatted inputs?
> diff --git a/stdio-common/vfscanf-internal.c b/stdio-common/vfscanf-internal.c
> index 4fec12345c..d9675bd4b1 100644
> --- a/stdio-common/vfscanf-internal.c
> +++ b/stdio-common/vfscanf-internal.c
> @@ -1428,6 +1428,16 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr,
> c = inchar ();
> }
> }
> + else if ((mode_flags & SCANF_ISOC23_BIN_CST) != 0
> + && base == 0
> + && width != 0
> + && TOLOWER (c) == L_('b'))
> + {
> + base = 2;
> + if (width > 0)
> + --width;
> + c = inchar ();
> + }
> else if (base == 0)
> base = 8;
> }
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
> index 67d476383a..4b047d608d 100644
> --- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
> @@ -24,7 +24,13 @@ ldbl-extra-routines += isoc99_fwscanf \
> isoc99_wscanf \
> isoc99_vfwscanf \
> isoc99_vswscanf \
> - isoc99_vwscanf
> + isoc99_vwscanf \
> + isoc23_fwscanf \
> + isoc23_swscanf \
> + isoc23_wscanf \
> + isoc23_vfwscanf \
> + isoc23_vswscanf \
> + isoc23_vwscanf
>
> tests-internal += test-wcstold-ibm128 test-wcstold-ieee128
> CFLAGS-test-wcstold-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
> @@ -53,7 +59,13 @@ ldbl-extra-routines += printf_size \
> isoc99_sscanf \
> isoc99_vfscanf \
> isoc99_vscanf \
> - isoc99_vsscanf
> + isoc99_vsscanf \
> + isoc23_fscanf \
> + isoc23_scanf \
> + isoc23_sscanf \
> + isoc23_vfscanf \
> + isoc23_vscanf \
> + isoc23_vsscanf
>
> # Printing long double values with IEEE binary128 format reuses part
> # of the internal float128 implementation (__printf_fp, __printf_fphex,
> @@ -306,6 +318,70 @@ CFLAGS-test-ldouble-compat_totalorder.c += -mabi=ibmlongdouble
> CFLAGS-test-ldouble-compat_totalordermag.c += -mabi=ibmlongdouble
> endif
>
> +ifeq ($(subdir), stdio-common)
> +tests += tst-ibm128-scanf-binary-c11 tst-ibm128-scanf-binary-c2x \
> + tst-ibm128-scanf-binary-gnu11 tst-ibm128-scanf-binary-gnu89 \
> + tst-ieee128-scanf-binary-c11 tst-ieee128-scanf-binary-c2x \
> + tst-ieee128-scanf-binary-gnu11 tst-ieee128-scanf-binary-gnu89
One entry per line.
> +
> +# Some versions of GCC supported for building glibc do not support -std=c2x, so
> +# the test for that version uses -std=c11 and then _ISOC2X_SOURCE is defined in
> +# the test as needed.
> +CFLAGS-tst-ibm128-scanf-binary-c11.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=c11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ibm128-scanf-binary-c2x.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=c11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ibm128-scanf-binary-gnu11.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=gnu11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ibm128-scanf-binary-gnu89.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=gnu89 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-scanf-binary-c11.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-scanf-binary-c2x.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-scanf-binary-gnu11.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=gnu11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-scanf-binary-gnu89.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=gnu89 \
> + -DOBJPFX=\"$(objpfx)\"
> +
> +endif
> +
> +ifeq ($(subdir), wcsmbs)
> +tests += tst-ibm128-wscanf-binary-c11 tst-ibm128-wscanf-binary-c2x \
> + tst-ibm128-wscanf-binary-gnu11 tst-ibm128-wscanf-binary-gnu89 \
> + tst-ieee128-wscanf-binary-c11 tst-ieee128-wscanf-binary-c2x \
> + tst-ieee128-wscanf-binary-gnu11 tst-ieee128-wscanf-binary-gnu89
One entry per line.
> +
> +# Some versions of GCC supported for building glibc do not support -std=c2x, so
> +# the test for that version uses -std=c11 and then _ISOC2X_SOURCE is defined in
> +# the test as needed.
> +CFLAGS-tst-ibm128-wscanf-binary-c11.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=c11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ibm128-wscanf-binary-c2x.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=c11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ibm128-wscanf-binary-gnu11.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=gnu11 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ibm128-wscanf-binary-gnu89.c += -mabi=ibmlongdouble -Wno-psabi \
> + -std=gnu89 -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-wscanf-binary-c11.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-wscanf-binary-c2x.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-wscanf-binary-gnu11.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=gnu11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-ieee128-wscanf-binary-gnu89.c += -mfloat128 -mabi=ieeelongdouble \
> + -Wno-psabi -std=gnu89 \
> + -DOBJPFX=\"$(objpfx)\"
> +
> +endif
> +
> # Add IEEE binary128 files as make targets.
> routines += $(foreach r,$(ldbl-extra-routines),ieee128-$(r))
>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
> index d4ffd3762b..c0679a1153 100644
> --- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
> @@ -258,4 +258,18 @@ libc {
> __qecvtieee128_r;
> __qfcvtieee128_r;
> }
> + GLIBC_2.38 {
> + __isoc23_fscanfieee128;
> + __isoc23_scanfieee128;
> + __isoc23_sscanfieee128;
> + __isoc23_vfscanfieee128;
> + __isoc23_vscanfieee128;
> + __isoc23_vsscanfieee128;
> + __isoc23_fwscanfieee128;
> + __isoc23_swscanfieee128;
> + __isoc23_wscanfieee128;
> + __isoc23_vfwscanfieee128;
> + __isoc23_vswscanfieee128;
> + __isoc23_vwscanfieee128;
> + }
> }
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_fscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_fscanf.c
> new file mode 100644
> index 0000000000..6d651a5d3f
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_fscanf.c
> @@ -0,0 +1,36 @@
> +/* Wrapper for __isoc23_fscanf. IEEE128 version.
> + Copyright (C) 2019-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/libioP.h>
> +
> +extern int
> +___ieee128_isoc23_fscanf (FILE *fp, const char *format, ...)
> +{
> + va_list arg;
> + int done;
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> +
> + va_start (arg, format);
> + done = __vfscanf_internal (fp, format, arg, mode_flags);
> + va_end (arg);
> +
> + return done;
> +}
> +strong_alias (___ieee128_isoc23_fscanf, __isoc23_fscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_fwscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_fwscanf.c
> new file mode 100644
> index 0000000000..f9ba69ba50
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_fwscanf.c
> @@ -0,0 +1,36 @@
> +/* Wrapper for __isoc23_fwscanf. IEEE128 version.
> + Copyright (C) 2019-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 <libioP.h>
> +
> +extern int
> +___ieee128_isoc23_fwscanf (FILE *fp, const wchar_t *format, ...)
> +{
> + va_list ap;
> + int done;
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> +
> + va_start (ap, format);
> + done = __vfwscanf_internal (fp, format, ap, mode_flags);
> + va_end (ap);
> +
> + return done;
> +}
> +strong_alias (___ieee128_isoc23_fwscanf, __isoc23_fwscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_scanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_scanf.c
> new file mode 100644
> index 0000000000..4a128392b8
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_scanf.c
> @@ -0,0 +1,36 @@
> +/* Wrapper for __isoc23_scanf. IEEE128 version.
> + Copyright (C) 2019-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/libioP.h>
> +
> +extern int
> +___ieee128_isoc23_scanf (const char *format, ...)
> +{
> + va_list arg;
> + int done;
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> +
> + va_start (arg, format);
> + done = __vfscanf_internal (stdin, format, arg, mode_flags);
> + va_end (arg);
> +
> + return done;
> +}
> +strong_alias (___ieee128_isoc23_scanf, __isoc23_scanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_sscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_sscanf.c
> new file mode 100644
> index 0000000000..9845e6a282
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_sscanf.c
> @@ -0,0 +1,41 @@
> +/* Wrapper for __isoc23_sscanf. IEEE128 version.
> + Copyright (C) 2019-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 <strfile.h>
> +#include <libioP.h>
> +
> +extern int
> +___ieee128_isoc23_sscanf (const char *string, const char *format, ...)
> +{
> + va_list arg;
> + int done;
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> +
> + _IO_strfile sf;
> + FILE *fp = _IO_strfile_read (&sf, string);
> +
> + va_start (arg, format);
> + done = __vfscanf_internal (fp, format, arg, mode_flags);
> + va_end (arg);
> +
> + return done;
> +}
> +strong_alias (___ieee128_isoc23_sscanf, __isoc23_sscanfieee128)
> +hidden_def (___ieee128_isoc23_sscanf)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_swscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_swscanf.c
> new file mode 100644
> index 0000000000..b50a2bfbca
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_swscanf.c
> @@ -0,0 +1,41 @@
> +/* Wrapper for __isoc23_swscanf. IEEE128 version.
> + Copyright (C) 2019-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 <strfile.h>
> +#include <libioP.h>
> +
> +extern int
> +___ieee128_isoc23_swscanf (const wchar_t *string, const wchar_t *format, ...)
> +{
> + va_list ap;
> + int done;
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> +
> + _IO_strfile sf;
> + struct _IO_wide_data wd;
> + FILE *fp = _IO_strfile_readw (&sf, &wd, string);
> +
> + va_start (ap, format);
> + done = __vfwscanf_internal (fp, format, ap, mode_flags);
> + va_end (ap);
> +
> + return done;
> +}
> +strong_alias (___ieee128_isoc23_swscanf, __isoc23_swscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vfscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vfscanf.c
> new file mode 100644
> index 0000000000..876cc0c6d0
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vfscanf.c
> @@ -0,0 +1,30 @@
> +/* Wrapper for __isoc23_vfscanf. IEEE128 version.
> + Copyright (C) 2019-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 <libio/libioP.h>
> +#include <stdio.h>
> +
> +extern int
> +___ieee128_isoc23_vfscanf (FILE *fp, const char *format, va_list ap)
> +{
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> + return __vfscanf_internal (fp, format, ap, mode_flags);
> +}
> +strong_alias (___ieee128_isoc23_vfscanf, __isoc23_vfscanfieee128)
> +hidden_def (___ieee128_isoc23_vfscanf)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vfwscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vfwscanf.c
> new file mode 100644
> index 0000000000..752b245343
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vfwscanf.c
> @@ -0,0 +1,28 @@
> +/* Wrapper for __isoc23_vfwscanf. IEEE128 version.
> + Copyright (C) 2019-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>
> +
> +extern int
> +___ieee128_isoc23_vfwscanf (FILE *fp, const wchar_t *format, va_list ap)
> +{
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> + return __vfwscanf_internal (fp, format, ap, mode_flags);
> +}
> +strong_alias (___ieee128_isoc23_vfwscanf, __isoc23_vfwscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vscanf.c
> new file mode 100644
> index 0000000000..ef36bd162f
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vscanf.c
> @@ -0,0 +1,28 @@
> +/* Wrapper for __isoc23_vscanf. IEEE128 version.
> + Copyright (C) 2019-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 <libio/libioP.h>
> +
> +extern int
> +___ieee128_isoc23_vscanf (const char *format, va_list ap)
> +{
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> + return __vfscanf_internal (stdin, format, ap, mode_flags);
> +}
> +strong_alias (___ieee128_isoc23_vscanf, __isoc23_vscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vsscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vsscanf.c
> new file mode 100644
> index 0000000000..5524d788a7
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vsscanf.c
> @@ -0,0 +1,32 @@
> +/* Wrapper for __isoc23_vsscanf. IEEE128 version.
> + Copyright (C) 2019-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 <strfile.h>
> +#include <libioP.h>
> +
> +extern int
> +___ieee128_isoc23_vsscanf (const char *string, const char *format, va_list ap)
> +{
> + _IO_strfile sf;
> + FILE *fp = _IO_strfile_read (&sf, string);
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> + return __vfscanf_internal (fp, format, ap, mode_flags);
> +}
> +strong_alias (___ieee128_isoc23_vsscanf, __isoc23_vsscanfieee128)
> +hidden_def (___ieee128_isoc23_vsscanf)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c
> new file mode 100644
> index 0000000000..4e893f2942
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c
> @@ -0,0 +1,33 @@
> +/* Wrapper for __isoc23_vswscanf. IEEE128 version.
> + Copyright (C) 2019-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 <wchar.h>
> +#include <strfile.h>
> +
> +extern int
> +___ieee128_isoc23_vswscanf (wchar_t *string, const wchar_t *format, va_list ap)
> +{
> + _IO_strfile sf;
> + struct _IO_wide_data wd;
> + FILE *fp = _IO_strfile_readw (&sf, &wd, string);
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> + return __vfwscanf_internal (fp, format, ap, mode_flags);
> +}
> +strong_alias (___ieee128_isoc23_vswscanf, __isoc23_vswscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vwscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vwscanf.c
> new file mode 100644
> index 0000000000..a68239d9f0
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vwscanf.c
> @@ -0,0 +1,28 @@
> +/* Wrapper for __isoc23_vwscanf. IEEE128 version.
> + Copyright (C) 2019-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>
> +
> +extern int
> +___ieee128_isoc23_vwscanf (const wchar_t *format, va_list ap)
> +{
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> + return __vfwscanf_internal (stdin, format, ap, mode_flags);
> +}
> +strong_alias (___ieee128_isoc23_vwscanf, __isoc23_vwscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_wscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_wscanf.c
> new file mode 100644
> index 0000000000..f596df2a39
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_wscanf.c
> @@ -0,0 +1,36 @@
> +/* Wrapper for __isoc23_wscanf. IEEE128 version.
> + Copyright (C) 2019-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 <libioP.h>
> +
> +extern int
> +___ieee128_isoc23_wscanf (const wchar_t *format, ...)
> +{
> + va_list ap;
> + int done;
> + int mode_flags =
> + SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;
> +
> + va_start (ap, format);
> + done = __vfwscanf_internal (stdin, format, ap, mode_flags);
> + va_end (ap);
> +
> + return done;
> +}
> +strong_alias (___ieee128_isoc23_wscanf, __isoc23_wscanfieee128)
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-c11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-c11.c
> new file mode 100644
> index 0000000000..31706beee6
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-c11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-scanf-binary-c11.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-c2x.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-c2x.c
> new file mode 100644
> index 0000000000..f8bb2e4be3
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-c2x.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-scanf-binary-c2x.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-gnu11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-gnu11.c
> new file mode 100644
> index 0000000000..074aeee208
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-gnu11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-scanf-binary-gnu11.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-gnu89.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-gnu89.c
> new file mode 100644
> index 0000000000..6091b33cb6
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-scanf-binary-gnu89.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-scanf-binary-gnu89.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-c11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-c11.c
> new file mode 100644
> index 0000000000..4885a8e265
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-c11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-wscanf-binary-c11.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-c2x.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-c2x.c
> new file mode 100644
> index 0000000000..bf0c3da75e
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-c2x.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-wscanf-binary-c2x.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-gnu11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-gnu11.c
> new file mode 100644
> index 0000000000..49ae257fbd
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-gnu11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-wscanf-binary-gnu11.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-gnu89.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-gnu89.c
> new file mode 100644
> index 0000000000..a76be283be
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ibm128-wscanf-binary-gnu89.c
> @@ -0,0 +1,2 @@
> +#define STDX "ibm128-"
> +#include <tst-wscanf-binary-gnu89.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-c11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-c11.c
> new file mode 100644
> index 0000000000..2570fcad5c
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-c11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-scanf-binary-c11.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-c2x.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-c2x.c
> new file mode 100644
> index 0000000000..d09c21394c
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-c2x.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-scanf-binary-c2x.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-gnu11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-gnu11.c
> new file mode 100644
> index 0000000000..4e08b6417f
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-gnu11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-scanf-binary-gnu11.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-gnu89.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-gnu89.c
> new file mode 100644
> index 0000000000..a917b3bfef
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-scanf-binary-gnu89.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-scanf-binary-gnu89.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-c11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-c11.c
> new file mode 100644
> index 0000000000..a6a6bae1cd
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-c11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-wscanf-binary-c11.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-c2x.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-c2x.c
> new file mode 100644
> index 0000000000..7e2d27c6d2
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-c2x.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-wscanf-binary-c2x.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-gnu11.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-gnu11.c
> new file mode 100644
> index 0000000000..d81d2d7136
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-gnu11.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-wscanf-binary-gnu11.c>
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-gnu89.c b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-gnu89.c
> new file mode 100644
> index 0000000000..f405923e0f
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/tst-ieee128-wscanf-binary-gnu89.c
> @@ -0,0 +1,2 @@
> +#define STDX "ieee128-"
> +#include <tst-wscanf-binary-gnu89.c>
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile
> index 1d01846476..fec804808c 100644
> --- a/sysdeps/ieee754/ldbl-opt/Makefile
> +++ b/sysdeps/ieee754/ldbl-opt/Makefile
> @@ -42,6 +42,10 @@ libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \
> isoc99_vscanf isoc99_vfscanf isoc99_vsscanf \
> isoc99_wscanf isoc99_fwscanf isoc99_swscanf \
> isoc99_vwscanf isoc99_vfwscanf isoc99_vswscanf \
> + isoc23_scanf isoc23_fscanf isoc23_sscanf \
> + isoc23_vscanf isoc23_vfscanf isoc23_vsscanf \
> + isoc23_wscanf isoc23_fwscanf isoc23_swscanf \
> + isoc23_vwscanf isoc23_vfwscanf isoc23_vswscanf \
> nextup nextdown totalorder totalordermag getpayload \
> canonicalize setpayload setpayloadsig llogb fmaxmag fminmag \
> roundeven fromfp ufromfp fromfpx ufromfpx fadd dadd \
> @@ -221,3 +225,39 @@ $(objpfx)tst-nldbl-error.c: tst-ldbl-error.c
> CFLAGS-tst-nldbl-warn.c += -mlong-double-64
> CFLAGS-tst-nldbl-error.c += -mlong-double-64
> endif
> +
> +ifeq ($(subdir), stdio-common)
> +tests += tst-nldbl-scanf-binary-c11 tst-nldbl-scanf-binary-c2x \
> + tst-nldbl-scanf-binary-gnu11 tst-nldbl-scanf-binary-gnu89
> +
> +# Some versions of GCC supported for building glibc do not support -std=c2x, so
> +# the test for that version uses -std=c11 and then _ISOC2X_SOURCE is defined in
> +# the test as needed.
> +CFLAGS-tst-nldbl-scanf-binary-c11.c += -mlong-double-64 -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-nldbl-scanf-binary-c2x.c += -mlong-double-64 -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-nldbl-scanf-binary-gnu11.c += -mlong-double-64 -std=gnu11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-nldbl-scanf-binary-gnu89.c += -mlong-double-64 -std=gnu89 \
> + -DOBJPFX=\"$(objpfx)\"
> +
> +endif
> +
> +ifeq ($(subdir), wcsmbs)
> +tests += tst-nldbl-wscanf-binary-c11 tst-nldbl-wscanf-binary-c2x \
> + tst-nldbl-wscanf-binary-gnu11 tst-nldbl-wscanf-binary-gnu89
One line per entry.
> +
> +# Some versions of GCC supported for building glibc do not support -std=c2x, so
> +# the test for that version uses -std=c11 and then _ISOC2X_SOURCE is defined in
> +# the test as needed.
> +CFLAGS-tst-nldbl-wscanf-binary-c11.c += -mlong-double-64 -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-nldbl-wscanf-binary-c2x.c += -mlong-double-64 -std=c11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-nldbl-wscanf-binary-gnu11.c += -mlong-double-64 -std=gnu11 \
> + -DOBJPFX=\"$(objpfx)\"
> +CFLAGS-tst-nldbl-wscanf-binary-gnu89.c += -mlong-double-64 -std=gnu89 \
> + -DOBJPFX=\"$(objpfx)\"
> +
> +endif
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/Versions b/sysdeps/ieee754/ldbl-opt/Versions
> index 21a2db6888..5345f1c683 100644
> --- a/sysdeps/ieee754/ldbl-opt/Versions
> +++ b/sysdeps/ieee754/ldbl-opt/Versions
> @@ -84,6 +84,20 @@ libc {
> __nldbl_err; __nldbl_verr; __nldbl_errx; __nldbl_verrx;
> __nldbl_error; __nldbl_error_at_line;
> }
> + GLIBC_2.38 {
> + __nldbl___isoc23_scanf;
> + __nldbl___isoc23_fscanf;
> + __nldbl___isoc23_sscanf;
> + __nldbl___isoc23_vscanf;
> + __nldbl___isoc23_vfscanf;
> + __nldbl___isoc23_vsscanf;
> + __nldbl___isoc23_wscanf;
> + __nldbl___isoc23_fwscanf;
> + __nldbl___isoc23_swscanf;
> + __nldbl___isoc23_vwscanf;
> + __nldbl___isoc23_vfwscanf;
> + __nldbl___isoc23_vswscanf;
> + }
> }
> libm {
> NLDBL_VERSION {
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c
> index c654ebe416..22112c54d4 100644
> --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c
> @@ -45,6 +45,10 @@ libc_hidden_proto (__nldbl___isoc99_vsscanf)
> libc_hidden_proto (__nldbl___isoc99_vfscanf)
> libc_hidden_proto (__nldbl___isoc99_vswscanf)
> libc_hidden_proto (__nldbl___isoc99_vfwscanf)
> +libc_hidden_proto (__nldbl___isoc23_vsscanf)
> +libc_hidden_proto (__nldbl___isoc23_vfscanf)
> +libc_hidden_proto (__nldbl___isoc23_vswscanf)
> +libc_hidden_proto (__nldbl___isoc23_vfwscanf)
>
> /* Compatibility with IEEE double as long double.
> IEEE quad long double is used by default for most programs, so
> @@ -992,6 +996,172 @@ __nldbl___isoc99_wscanf (const wchar_t *fmt, ...)
> return ret;
> }
>
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_vfscanf (FILE *s, const char *fmt, va_list ap)
> +{
> + return __vfscanf_internal (s, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> +}
> +libc_hidden_def (__nldbl___isoc23_vfscanf)
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_sscanf (const char *s, const char *fmt, ...)
> +{
> + _IO_strfile sf;
> + FILE *f = _IO_strfile_read (&sf, s);
> + va_list ap;
> + int ret;
> +
> + va_start (ap, fmt);
> + ret = __vfscanf_internal (f, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> + va_end (ap);
> +
> + return ret;
> +}
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_vsscanf (const char *s, const char *fmt, va_list ap)
> +{
> + _IO_strfile sf;
> + FILE *f = _IO_strfile_read (&sf, s);
> +
> + return __vfscanf_internal (f, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> +}
> +libc_hidden_def (__nldbl___isoc23_vsscanf)
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_vscanf (const char *fmt, va_list ap)
> +{
> + return __vfscanf_internal (stdin, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> +}
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_fscanf (FILE *s, const char *fmt, ...)
> +{
> + va_list ap;
> + int ret;
> +
> + va_start (ap, fmt);
> + ret = __vfscanf_internal (s, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> + va_end (ap);
> +
> + return ret;
> +}
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_scanf (const char *fmt, ...)
> +{
> + va_list ap;
> + int ret;
> +
> + va_start (ap, fmt);
> + ret = __vfscanf_internal (stdin, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> + va_end (ap);
> +
> + return ret;
> +}
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_vfwscanf (FILE *s, const wchar_t *fmt, va_list ap)
> +{
> + return __vfwscanf_internal (s, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> +}
> +libc_hidden_def (__nldbl___isoc23_vfwscanf)
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_swscanf (const wchar_t *s, const wchar_t *fmt, ...)
> +{
> + _IO_strfile sf;
> + struct _IO_wide_data wd;
> + FILE *f = _IO_strfile_readw (&sf, &wd, s);
> + va_list ap;
> + int ret;
> +
> + va_start (ap, fmt);
> + ret = __vfwscanf_internal (f, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> + va_end (ap);
> +
> + return ret;
> +}
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_vswscanf (const wchar_t *s, const wchar_t *fmt, va_list ap)
> +{
> + _IO_strfile sf;
> + struct _IO_wide_data wd;
> + FILE *f = _IO_strfile_readw (&sf, &wd, s);
> +
> + return __vfwscanf_internal (f, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> +}
> +libc_hidden_def (__nldbl___isoc23_vswscanf)
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_vwscanf (const wchar_t *fmt, va_list ap)
> +{
> + return __vfwscanf_internal (stdin, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> +}
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_fwscanf (FILE *s, const wchar_t *fmt, ...)
> +{
> + va_list ap;
> + int ret;
> +
> + va_start (ap, fmt);
> + ret = __vfwscanf_internal (s, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> + va_end (ap);
> +
> + return ret;
> +}
> +
> +int
> +attribute_compat_text_section
> +__nldbl___isoc23_wscanf (const wchar_t *fmt, ...)
> +{
> + va_list ap;
> + int ret;
> +
> + va_start (ap, fmt);
> + ret = __vfwscanf_internal (stdin, fmt, ap,
> + SCANF_LDBL_IS_DBL | SCANF_ISOC99_A
> + | SCANF_ISOC23_BIN_CST);
> + va_end (ap);
> +
> + return ret;
> +}
> +
> void
> __nldbl_argp_error (const struct argp_state *state, const char *fmt, ...)
> {
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
> index 7309e8a80f..d514442d87 100644
> --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
> @@ -78,6 +78,18 @@ NLDBL_DECL (__isoc99_swscanf);
> NLDBL_DECL (__isoc99_vwscanf);
> NLDBL_DECL (__isoc99_vfwscanf);
> NLDBL_DECL (__isoc99_vswscanf);
> +NLDBL_DECL (__isoc23_scanf);
> +NLDBL_DECL (__isoc23_fscanf);
> +NLDBL_DECL (__isoc23_sscanf);
> +NLDBL_DECL (__isoc23_vscanf);
> +NLDBL_DECL (__isoc23_vfscanf);
> +NLDBL_DECL (__isoc23_vsscanf);
> +NLDBL_DECL (__isoc23_wscanf);
> +NLDBL_DECL (__isoc23_fwscanf);
> +NLDBL_DECL (__isoc23_swscanf);
> +NLDBL_DECL (__isoc23_vwscanf);
> +NLDBL_DECL (__isoc23_vfwscanf);
> +NLDBL_DECL (__isoc23_vswscanf);
> NLDBL_DECL (argp_error);
> NLDBL_DECL (argp_failure);
> NLDBL_DECL (warn);
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_fscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_fscanf.c
> new file mode 100644
> index 0000000000..7b5a0565f7
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_fscanf.c
> @@ -0,0 +1,15 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_fscanf (FILE *stream, const char *fmt, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, fmt);
> + done = __nldbl___isoc23_vfscanf (stream, fmt, arg);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_fwscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_fwscanf.c
> new file mode 100644
> index 0000000000..4ecb340143
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_fwscanf.c
> @@ -0,0 +1,15 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_fwscanf (FILE *stream, const wchar_t *fmt, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, fmt);
> + done = __nldbl___isoc23_vfwscanf (stream, fmt, arg);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_scanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_scanf.c
> new file mode 100644
> index 0000000000..90ea10c115
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_scanf.c
> @@ -0,0 +1,15 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_scanf (const char *fmt, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, fmt);
> + done = __nldbl___isoc23_vfscanf (stdin, fmt, arg);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_sscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_sscanf.c
> new file mode 100644
> index 0000000000..64124e479c
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_sscanf.c
> @@ -0,0 +1,15 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_sscanf (const char *s, const char *fmt, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, fmt);
> + done = __nldbl___isoc23_vsscanf (s, fmt, arg);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_swscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_swscanf.c
> new file mode 100644
> index 0000000000..da84c318b2
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_swscanf.c
> @@ -0,0 +1,15 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_swscanf (const wchar_t *s, const wchar_t *fmt, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, fmt);
> + done = __nldbl___isoc23_vswscanf (s, fmt, arg);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vfscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vfscanf.c
> new file mode 100644
> index 0000000000..671aa63ec6
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vfscanf.c
> @@ -0,0 +1,8 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_vfscanf (FILE *s, const char *fmt, va_list ap)
> +{
> + return __nldbl___isoc23_vfscanf (s, fmt, ap);
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vfwscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vfwscanf.c
> new file mode 100644
> index 0000000000..b069522cd1
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vfwscanf.c
> @@ -0,0 +1,8 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_vfwscanf (FILE *s, const wchar_t *fmt, va_list ap)
> +{
> + return __nldbl___isoc23_vfwscanf (s, fmt, ap);
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vscanf.c
> new file mode 100644
> index 0000000000..f2256f210f
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vscanf.c
> @@ -0,0 +1,8 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_vscanf (const char *fmt, va_list ap)
> +{
> + return __nldbl___isoc23_vfscanf (stdin, fmt, ap);
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vsscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vsscanf.c
> new file mode 100644
> index 0000000000..96ce46b317
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vsscanf.c
> @@ -0,0 +1,8 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_vsscanf (const char *string, const char *fmt, va_list ap)
> +{
> + return __nldbl___isoc23_vsscanf (string, fmt, ap);
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vswscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vswscanf.c
> new file mode 100644
> index 0000000000..0819b55a2c
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vswscanf.c
> @@ -0,0 +1,8 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_vswscanf (const wchar_t *string, const wchar_t *fmt, va_list ap)
> +{
> + return __nldbl___isoc23_vswscanf (string, fmt, ap);
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vwscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vwscanf.c
> new file mode 100644
> index 0000000000..f92876ec27
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_vwscanf.c
> @@ -0,0 +1,8 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_vwscanf (const wchar_t *fmt, va_list ap)
> +{
> + return __nldbl___isoc23_vfwscanf (stdin, fmt, ap);
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_wscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_wscanf.c
> new file mode 100644
> index 0000000000..cece258845
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-isoc23_wscanf.c
> @@ -0,0 +1,15 @@
> +#include "nldbl-compat.h"
> +
> +int
> +attribute_hidden
> +__isoc23_wscanf (const wchar_t *fmt, ...)
> +{
> + va_list arg;
> + int done;
> +
> + va_start (arg, fmt);
> + done = __nldbl___isoc23_vfwscanf (stdin, fmt, arg);
> + va_end (arg);
> +
> + return done;
> +}
Ok.
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-c11.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-c11.c
> new file mode 100644
> index 0000000000..f5bc396fcc
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-c11.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-scanf-binary-c11.c>
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-c2x.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-c2x.c
> new file mode 100644
> index 0000000000..4e0cf7570f
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-c2x.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-scanf-binary-c2x.c>
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-gnu11.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-gnu11.c
> new file mode 100644
> index 0000000000..10e228e98a
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-gnu11.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-scanf-binary-gnu11.c>
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-gnu89.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-gnu89.c
> new file mode 100644
> index 0000000000..c5da04b644
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-scanf-binary-gnu89.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-scanf-binary-gnu89.c>
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-c11.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-c11.c
> new file mode 100644
> index 0000000000..0e66e97cf7
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-c11.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-wscanf-binary-c11.c>
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-c2x.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-c2x.c
> new file mode 100644
> index 0000000000..7637aab0d4
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-c2x.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-wscanf-binary-c2x.c>
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-gnu11.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-gnu11.c
> new file mode 100644
> index 0000000000..106ec38bce
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-gnu11.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-wscanf-binary-gnu11.c>
> diff --git a/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-gnu89.c b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-gnu89.c
> new file mode 100644
> index 0000000000..61a15619d2
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-opt/tst-nldbl-wscanf-binary-gnu89.c
> @@ -0,0 +1,2 @@
> +#define STDX "nldbl-"
> +#include <tst-wscanf-binary-gnu89.c>
Ok.
> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> index a0419a13d0..ed0c4789eb 100644
> --- a/sysdeps/mach/hurd/i386/libc.abilist
> +++ b/sysdeps/mach/hurd/i386/libc.abilist
> @@ -2294,6 +2294,10 @@ GLIBC_2.36 arc4random_buf F
> GLIBC_2.36 arc4random_uniform F
> GLIBC_2.36 c8rtomb F
> GLIBC_2.36 mbrtoc8 F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2304,6 +2308,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2314,6 +2325,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index 62e80648e8..0e2d9c3045 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2633,6 +2633,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2643,6 +2647,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2653,3 +2664,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index 9d490fdee8..f1bec1978d 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2730,6 +2730,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2740,6 +2744,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2750,6 +2761,19 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
> index 50874e92fc..aa874b88d0 100644
> --- a/sysdeps/unix/sysv/linux/arc/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
> @@ -2394,6 +2394,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2404,6 +2408,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2414,3 +2425,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> index 544b5b2741..afbd57da6f 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> @@ -514,6 +514,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -524,6 +528,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -534,6 +545,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 _Exit F
> GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> index da532a0191..e7364cd3fe 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> @@ -511,6 +511,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -521,6 +525,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -531,6 +542,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 _Exit F
> GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> index 6c74a60d69..913fa59215 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> @@ -2670,6 +2670,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2680,6 +2684,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2690,3 +2701,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index 13d30e646f..43af3a9811 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -2619,6 +2619,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2629,6 +2633,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2639,6 +2650,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index f5dfa2a20e..af72f8fab0 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2803,6 +2803,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2813,6 +2817,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2823,6 +2834,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 58f1526030..48cbb0fa50 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -2568,6 +2568,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2578,6 +2582,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2588,6 +2599,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> index 46ce2437fe..c15884bb0b 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> @@ -2154,6 +2154,10 @@ GLIBC_2.36 wprintf F
> GLIBC_2.36 write F
> GLIBC_2.36 writev F
> GLIBC_2.36 wscanf F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2164,6 +2168,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2174,3 +2185,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index f34085ce35..3738db81df 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -515,6 +515,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -525,6 +529,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -535,6 +546,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 _Exit F
> GLIBC_2.4 _IO_2_1_stderr_ D 0x98
> GLIBC_2.4 _IO_2_1_stdin_ D 0x98
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 349377d154..ed13627752 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -2746,6 +2746,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2756,6 +2760,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2766,6 +2777,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> index 38e7fb9b2a..8357738621 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> @@ -2719,6 +2719,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2729,6 +2733,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2739,3 +2750,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> index ec4ca27b75..58c5da583d 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> @@ -2716,6 +2716,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2726,6 +2730,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2736,3 +2747,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index bd3f3404fb..d3741945cd 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -2711,6 +2711,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2721,6 +2725,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2731,6 +2742,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 9b09fab6ec..5319fdc204 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -2709,6 +2709,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2719,6 +2723,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2729,6 +2740,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 3b8f2b8ca3..1743ea6eb9 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -2717,6 +2717,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2727,6 +2731,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2737,6 +2748,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 497553414d..9b1f53c6ac 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -2619,6 +2619,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2629,6 +2633,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2639,6 +2650,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index f67f241498..ae1c6ca1b5 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2758,6 +2758,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2768,6 +2772,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2778,3 +2789,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> index a59a58f44c..a7c572c947 100644
> --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> @@ -2140,6 +2140,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2150,6 +2154,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2160,3 +2171,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index a1bcf79955..074fa031a7 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -2773,6 +2773,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2783,6 +2787,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2793,6 +2804,19 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index c0f28aea45..dfcb4bd2d5 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -2806,6 +2806,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2816,6 +2820,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2826,6 +2837,19 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> index 6b4459964f..63bbccf3f9 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> @@ -2527,6 +2527,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2537,6 +2541,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2547,6 +2558,19 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> index e90fb502d2..ab85fd61ef 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> @@ -2829,6 +2829,14 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fscanfieee128 F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_fwscanfieee128 F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_scanfieee128 F
> +GLIBC_2.38 __isoc23_sscanf F
> +GLIBC_2.38 __isoc23_sscanfieee128 F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2839,6 +2847,20 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_swscanfieee128 F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfscanfieee128 F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vfwscanfieee128 F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vscanfieee128 F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vsscanfieee128 F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vswscanfieee128 F
> +GLIBC_2.38 __isoc23_vwscanf F
> +GLIBC_2.38 __isoc23_vwscanfieee128 F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2849,3 +2871,17 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __isoc23_wscanfieee128 F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> index 29be561b60..b716f5c763 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> @@ -2396,6 +2396,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2406,6 +2410,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2416,3 +2427,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index 506a4e6a65..774e777b65 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2596,6 +2596,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2606,6 +2610,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2616,3 +2627,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index 976cd741ee..8625135c48 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -2771,6 +2771,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2781,6 +2785,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2791,6 +2802,19 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index 909ec927dc..d00c7eb262 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -2564,6 +2564,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2574,6 +2578,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2584,6 +2595,19 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> index 31a777c4aa..b63037241d 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> @@ -2626,6 +2626,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2636,6 +2640,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2646,6 +2657,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> index 8d43e8c952..d80055617d 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> @@ -2623,6 +2623,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2633,6 +2637,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2643,6 +2654,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 91c552dc4c..5be55c11d2 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -2766,6 +2766,10 @@ GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> GLIBC_2.37 __ppoll64_chk F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2776,6 +2780,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2786,6 +2797,19 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> +GLIBC_2.38 __nldbl___isoc23_fscanf F
> +GLIBC_2.38 __nldbl___isoc23_fwscanf F
> +GLIBC_2.38 __nldbl___isoc23_scanf F
> +GLIBC_2.38 __nldbl___isoc23_sscanf F
> +GLIBC_2.38 __nldbl___isoc23_swscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfscanf F
> +GLIBC_2.38 __nldbl___isoc23_vfwscanf F
> +GLIBC_2.38 __nldbl___isoc23_vscanf F
> +GLIBC_2.38 __nldbl___isoc23_vsscanf F
> +GLIBC_2.38 __nldbl___isoc23_vswscanf F
> +GLIBC_2.38 __nldbl___isoc23_vwscanf F
> +GLIBC_2.38 __nldbl___isoc23_wscanf F
> GLIBC_2.4 _IO_fprintf F
> GLIBC_2.4 _IO_printf F
> GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index c5c5e5cf9a..475fdaae15 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -2591,6 +2591,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2601,6 +2605,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2611,6 +2622,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index e51996e046..6cfb928bc8 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -2542,6 +2542,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2552,6 +2556,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2562,6 +2573,7 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
> GLIBC_2.4 __confstr_chk F
> GLIBC_2.4 __fgets_chk F
> GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 388536b3be..c735097172 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2648,6 +2648,10 @@ GLIBC_2.36 pidfd_open F
> GLIBC_2.36 pidfd_send_signal F
> GLIBC_2.36 process_madvise F
> GLIBC_2.36 process_mrelease F
> +GLIBC_2.38 __isoc23_fscanf F
> +GLIBC_2.38 __isoc23_fwscanf F
> +GLIBC_2.38 __isoc23_scanf F
> +GLIBC_2.38 __isoc23_sscanf F
> GLIBC_2.38 __isoc23_strtoimax F
> GLIBC_2.38 __isoc23_strtol F
> GLIBC_2.38 __isoc23_strtol_l F
> @@ -2658,6 +2662,13 @@ GLIBC_2.38 __isoc23_strtoul_l F
> GLIBC_2.38 __isoc23_strtoull F
> GLIBC_2.38 __isoc23_strtoull_l F
> GLIBC_2.38 __isoc23_strtoumax F
> +GLIBC_2.38 __isoc23_swscanf F
> +GLIBC_2.38 __isoc23_vfscanf F
> +GLIBC_2.38 __isoc23_vfwscanf F
> +GLIBC_2.38 __isoc23_vscanf F
> +GLIBC_2.38 __isoc23_vsscanf F
> +GLIBC_2.38 __isoc23_vswscanf F
> +GLIBC_2.38 __isoc23_vwscanf F
> GLIBC_2.38 __isoc23_wcstoimax F
> GLIBC_2.38 __isoc23_wcstol F
> GLIBC_2.38 __isoc23_wcstol_l F
> @@ -2668,3 +2679,4 @@ GLIBC_2.38 __isoc23_wcstoul_l F
> GLIBC_2.38 __isoc23_wcstoull F
> GLIBC_2.38 __isoc23_wcstoull_l F
> GLIBC_2.38 __isoc23_wcstoumax F
> +GLIBC_2.38 __isoc23_wscanf F
Ok.
> 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
>
Ok.
> 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)\"
Ok.
> 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;
> }
> }
Ok.
> 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
Ok.
> 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;
> +}
Ok.
> 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;
> +}
Ok.
> 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)
Ok.
> 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)
Ok.
> 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);
> +}
Ok.
> 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;
> +}
Ok.
> 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"
Ok.
> 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"
Ok.
> 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"
Ok.
> 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"
Ok.
> 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
>
>
Ok.
next prev parent reply other threads:[~2023-02-20 20:03 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-16 23:40 Joseph Myers
2023-02-20 20:03 ` Adhemerval Zanella Netto [this message]
2023-02-21 2:20 ` [v3] " Joseph Myers
2023-02-21 9:17 ` Andreas Schwab
2023-02-22 21:36 ` Joseph Myers
2023-03-02 16:43 ` Adhemerval Zanella Netto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f7a80d15-6c06-8db1-de8f-3669a4cc6612@linaro.org \
--to=adhemerval.zanella@linaro.org \
--cc=joseph@codesourcery.com \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).