public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
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.

  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).