Message ID | 20240524233950.1400154-1-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v3] Make __nldbl__IO_vfscanf a compat symbol [BZ #31776] | expand |
Hi Peter, Joseph, Any comments on this patch? Thanks. On Fri, May 24, 2024 at 4:39 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > Changes in v3: > > 1. Don't change stdio-common/test-fscanf.c. > 2. Don't include stdio-common/test-fscanf.c. > 3. Move test input files to stdio-common. > > Changes in v2: > > 1. No need to include <nldbl-abi.h> in nldbl-compat.c. > 2. Don't protect the __nldbl__IO_vfscanf compat symbol with > > #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) > > -- > Fix BZ #31776 by > > 1. Making __nldbl__IO_vfscanf a compat symbol. > 2. Remove _IO_vfscanf from libnldbl_nonshared.a. Since _IO_vfscanf is a > compat symbol, there is no point to provide it in libnldbl_nonshared.a. > 3. Change libnldbl_nonshared.a to call __nldbl_vfscanf, instead of > __nldbl__IO_vfscanf. > > Add fscanf/scanf/vfscanf/vscanf tests of long double as double without > including <stdio.h>. > > NB: Input files for fscanf tests must be under stdio-common. Otherwise, > Rules won't pick them up. > > Signed-off-by: H.J. Lu <hjl.tools@gmail.com> > --- > .../test-nldbl-fscanf-redirect-static.input | 4 + > stdio-common/test-nldbl-fscanf-redirect.input | 4 + > sysdeps/ieee754/ldbl-opt/Makefile | 12 ++- > sysdeps/ieee754/ldbl-opt/nldbl-compat.c | 4 + > sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c | 2 +- > sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c | 13 --- > sysdeps/ieee754/ldbl-opt/nldbl-scanf.c | 2 +- > sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c | 2 +- > sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c | 2 +- > .../test-nldbl-fscanf-redirect-static.c | 1 + > .../ldbl-opt/test-nldbl-fscanf-redirect.c | 98 +++++++++++++++++++ > 11 files changed, 126 insertions(+), 18 deletions(-) > create mode 100644 stdio-common/test-nldbl-fscanf-redirect-static.input > create mode 100644 stdio-common/test-nldbl-fscanf-redirect.input > delete mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c > create mode 100644 sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c > create mode 100644 sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c > > diff --git a/stdio-common/test-nldbl-fscanf-redirect-static.input b/stdio-common/test-nldbl-fscanf-redirect-static.input > new file mode 100644 > index 0000000000..20859d314a > --- /dev/null > +++ b/stdio-common/test-nldbl-fscanf-redirect-static.input > @@ -0,0 +1,4 @@ > +25 24.5 thompson > +25 24.5 thompson > +25 24.5 thompson > +25 24.5 thompson > diff --git a/stdio-common/test-nldbl-fscanf-redirect.input b/stdio-common/test-nldbl-fscanf-redirect.input > new file mode 100644 > index 0000000000..20859d314a > --- /dev/null > +++ b/stdio-common/test-nldbl-fscanf-redirect.input > @@ -0,0 +1,4 @@ > +25 24.5 thompson > +25 24.5 thompson > +25 24.5 thompson > +25 24.5 thompson > diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile > index d1eda5d022..81cb5b3a53 100644 > --- a/sysdeps/ieee754/ldbl-opt/Makefile > +++ b/sysdeps/ieee754/ldbl-opt/Makefile > @@ -101,7 +101,6 @@ libnldbl-calls = \ > getpayload \ > hypot \ > ilogb \ > - iovfscanf \ > isinf \ > isnan \ > isoc23_fscanf \ > @@ -428,11 +427,16 @@ endif > > ifeq ($(subdir), stdio-common) > tests += \ > + test-nldbl-fscanf-redirect \ > + test-nldbl-fscanf-redirect-static \ > tst-nldbl-scanf-binary-c11 \ > tst-nldbl-scanf-binary-c23 \ > tst-nldbl-scanf-binary-gnu11 \ > tst-nldbl-scanf-binary-gnu89 \ > # tests > +tests-static += \ > + test-nldbl-fscanf-redirect-static \ > +# tests-static > > # Some versions of GCC supported for building glibc do not support -std=c23 > # (added in GCC 14), or the older name -std=c2x (added in GCC 9), so > @@ -446,6 +450,12 @@ 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)\" > +CFLAGS-test-nldbl-fscanf-redirect.c += -mlong-double-64 > +CFLAGS-test-nldbl-fscanf-redirect-static.c += -mlong-double-64 > +$(objpfx)test-nldbl-fscanf-redirect: \ > + $(common-objpfx)math/libnldbl_nonshared.a > +$(objpfx)test-nldbl-fscanf-redirect-static: \ > + $(common-objpfx)math/libnldbl_nonshared.a > > endif > > diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c > index f0bfb1e8a1..b05e47f185 100644 > --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c > +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c > @@ -1336,3 +1336,7 @@ compat_symbol (libc, __nldbl___fprintf_chk, __fprintf_chk, GLIBC_2_3_4); > compat_symbol (libc, __nldbl___vprintf_chk, __vprintf_chk, GLIBC_2_3_4); > compat_symbol (libc, __nldbl___vfprintf_chk, __vfprintf_chk, GLIBC_2_3_4); > #endif > +#if SHLIB_COMPAT (libc, LONG_DOUBLE_COMPAT_VERSION, GLIBC_2_29) > +compat_symbol (libc, __nldbl__IO_vfscanf, __nldbl__IO_vfscanf, > + LONG_DOUBLE_COMPAT_VERSION); > +#endif > diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c > index 00507187f3..8f762944b9 100644 > --- a/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c > +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c > @@ -13,7 +13,7 @@ fscanf (FILE *stream, const char *fmt, ...) > int done; > > va_start (arg, fmt); > - done = __nldbl__IO_vfscanf (stream, fmt, arg, NULL); > + done = __nldbl_vfscanf (stream, fmt, arg); > va_end (arg); > > return done; > diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c > deleted file mode 100644 > index 6ed9b48624..0000000000 > --- a/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c > +++ /dev/null > @@ -1,13 +0,0 @@ > -/* This file defines one of the deprecated scanf variants. */ > -#include <features.h> > -#undef __GLIBC_USE_DEPRECATED_SCANF > -#define __GLIBC_USE_DEPRECATED_SCANF 1 > - > -#include "nldbl-compat.h" > - > -int > -attribute_hidden > -_IO_vfscanf (FILE *s, const char *fmt, va_list ap, int *errp) > -{ > - return __nldbl__IO_vfscanf (s, fmt, ap, errp); > -} > diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c > index c10da284f2..c7dd1b7bd0 100644 > --- a/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c > +++ b/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c > @@ -13,7 +13,7 @@ scanf (const char *fmt, ...) > int done; > > va_start (arg, fmt); > - done = __nldbl__IO_vfscanf (stdin, fmt, arg, NULL); > + done = __nldbl_vfscanf (stdin, fmt, arg); > va_end (arg); > > return done; > diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c > index 6f5ebc3045..076a06fe4f 100644 > --- a/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c > +++ b/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c > @@ -9,7 +9,7 @@ int > attribute_hidden > __vfscanf (FILE *s, const char *fmt, va_list ap) > { > - return __nldbl__IO_vfscanf (s, fmt, ap, NULL); > + return __nldbl_vfscanf (s, fmt, ap); > } > extern __typeof (__vfscanf) vfscanf attribute_hidden; > weak_alias (__vfscanf, vfscanf) > diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c > index 38f654aa73..7560ec5bac 100644 > --- a/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c > +++ b/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c > @@ -10,5 +10,5 @@ attribute_hidden > weak_function > vscanf (const char *fmt, va_list ap) > { > - return __nldbl__IO_vfscanf (stdin, fmt, ap, NULL); > + return __nldbl_vfscanf (stdin, fmt, ap); > } > diff --git a/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c > new file mode 100644 > index 0000000000..0e38f24b5a > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c > @@ -0,0 +1 @@ > +#include "test-nldbl-fscanf-redirect.c" > diff --git a/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c > new file mode 100644 > index 0000000000..507a3f4a7c > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c > @@ -0,0 +1,98 @@ > +/* Test fscanf/scanf/vfscanf/vscanf of long double as double without > + <stdio.h>. > + Copyright (C) 2024 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU 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 <string.h> > + > +#ifndef EXPECTED_LONG_DOUBLE_VALUE > +# define EXPECTED_LONG_DOUBLE_VALUE 24.5 > +#endif > + > +struct FILE; > +extern struct FILE *stdin; > +extern int fscanf (struct FILE *, const char *, ...); > +extern int scanf (const char *, ...); > +extern int vfscanf (struct FILE *, const char *, va_list); > +extern int vscanf (const char *, va_list); > +extern int printf (const char *format, ...); > + > +static int > +wrap_vfscanf (struct FILE *fp, const char *format, ...) > +{ > + va_list ap; > + va_start (ap, format); > + int ret = vfscanf (fp, format, ap); > + va_end (ap); > + return ret; > +} > + > +static int > +wrap_vscanf (const char *format, ...) > +{ > + va_list ap; > + va_start (ap, format); > + int ret = vscanf (format, ap); > + va_end (ap); > + return ret; > +} > + > +int > +main (void) > +{ > + int n, i; > + long double x; > + char name[50]; > + n = fscanf (stdin, "%d%Lf%s", &i, &x, name); > + printf ("fscanf : n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", > + n, i, x, name); > + if (n != 3 > + || i != 25 > + || x != EXPECTED_LONG_DOUBLE_VALUE > + || strcmp (name, "thompson")) > + return 1; > + > + n = scanf ("%d%Lf%s", &i, &x, name); > + printf ("scanf : n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", > + n, i, x, name); > + if (n != 3 > + || i != 25 > + || x != EXPECTED_LONG_DOUBLE_VALUE > + || strcmp (name, "thompson")) > + return 1; > + > + n = wrap_vfscanf (stdin, "%d%Lf%s", &i, &x, name); > + printf ("vfscanf: n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", > + n, i, x, name); > + if (n != 3 > + || i != 25 > + || x != EXPECTED_LONG_DOUBLE_VALUE > + || strcmp (name, "thompson")) > + return 1; > + > + n = wrap_vscanf ("%d%Lf%s", &i, &x, name); > + printf ("vscanf : n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", > + n, i, x, name); > + if (n != 3 > + || i != 25 > + || x != EXPECTED_LONG_DOUBLE_VALUE > + || strcmp (name, "thompson")) > + return 1; > + > + return 0; > +} > -- > 2.45.1 >
diff --git a/stdio-common/test-nldbl-fscanf-redirect-static.input b/stdio-common/test-nldbl-fscanf-redirect-static.input new file mode 100644 index 0000000000..20859d314a --- /dev/null +++ b/stdio-common/test-nldbl-fscanf-redirect-static.input @@ -0,0 +1,4 @@ +25 24.5 thompson +25 24.5 thompson +25 24.5 thompson +25 24.5 thompson diff --git a/stdio-common/test-nldbl-fscanf-redirect.input b/stdio-common/test-nldbl-fscanf-redirect.input new file mode 100644 index 0000000000..20859d314a --- /dev/null +++ b/stdio-common/test-nldbl-fscanf-redirect.input @@ -0,0 +1,4 @@ +25 24.5 thompson +25 24.5 thompson +25 24.5 thompson +25 24.5 thompson diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile index d1eda5d022..81cb5b3a53 100644 --- a/sysdeps/ieee754/ldbl-opt/Makefile +++ b/sysdeps/ieee754/ldbl-opt/Makefile @@ -101,7 +101,6 @@ libnldbl-calls = \ getpayload \ hypot \ ilogb \ - iovfscanf \ isinf \ isnan \ isoc23_fscanf \ @@ -428,11 +427,16 @@ endif ifeq ($(subdir), stdio-common) tests += \ + test-nldbl-fscanf-redirect \ + test-nldbl-fscanf-redirect-static \ tst-nldbl-scanf-binary-c11 \ tst-nldbl-scanf-binary-c23 \ tst-nldbl-scanf-binary-gnu11 \ tst-nldbl-scanf-binary-gnu89 \ # tests +tests-static += \ + test-nldbl-fscanf-redirect-static \ +# tests-static # Some versions of GCC supported for building glibc do not support -std=c23 # (added in GCC 14), or the older name -std=c2x (added in GCC 9), so @@ -446,6 +450,12 @@ 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)\" +CFLAGS-test-nldbl-fscanf-redirect.c += -mlong-double-64 +CFLAGS-test-nldbl-fscanf-redirect-static.c += -mlong-double-64 +$(objpfx)test-nldbl-fscanf-redirect: \ + $(common-objpfx)math/libnldbl_nonshared.a +$(objpfx)test-nldbl-fscanf-redirect-static: \ + $(common-objpfx)math/libnldbl_nonshared.a endif diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c index f0bfb1e8a1..b05e47f185 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c @@ -1336,3 +1336,7 @@ compat_symbol (libc, __nldbl___fprintf_chk, __fprintf_chk, GLIBC_2_3_4); compat_symbol (libc, __nldbl___vprintf_chk, __vprintf_chk, GLIBC_2_3_4); compat_symbol (libc, __nldbl___vfprintf_chk, __vfprintf_chk, GLIBC_2_3_4); #endif +#if SHLIB_COMPAT (libc, LONG_DOUBLE_COMPAT_VERSION, GLIBC_2_29) +compat_symbol (libc, __nldbl__IO_vfscanf, __nldbl__IO_vfscanf, + LONG_DOUBLE_COMPAT_VERSION); +#endif diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c index 00507187f3..8f762944b9 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c @@ -13,7 +13,7 @@ fscanf (FILE *stream, const char *fmt, ...) int done; va_start (arg, fmt); - done = __nldbl__IO_vfscanf (stream, fmt, arg, NULL); + done = __nldbl_vfscanf (stream, fmt, arg); va_end (arg); return done; diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c deleted file mode 100644 index 6ed9b48624..0000000000 --- a/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c +++ /dev/null @@ -1,13 +0,0 @@ -/* This file defines one of the deprecated scanf variants. */ -#include <features.h> -#undef __GLIBC_USE_DEPRECATED_SCANF -#define __GLIBC_USE_DEPRECATED_SCANF 1 - -#include "nldbl-compat.h" - -int -attribute_hidden -_IO_vfscanf (FILE *s, const char *fmt, va_list ap, int *errp) -{ - return __nldbl__IO_vfscanf (s, fmt, ap, errp); -} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c index c10da284f2..c7dd1b7bd0 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-scanf.c @@ -13,7 +13,7 @@ scanf (const char *fmt, ...) int done; va_start (arg, fmt); - done = __nldbl__IO_vfscanf (stdin, fmt, arg, NULL); + done = __nldbl_vfscanf (stdin, fmt, arg); va_end (arg); return done; diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c index 6f5ebc3045..076a06fe4f 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c @@ -9,7 +9,7 @@ int attribute_hidden __vfscanf (FILE *s, const char *fmt, va_list ap) { - return __nldbl__IO_vfscanf (s, fmt, ap, NULL); + return __nldbl_vfscanf (s, fmt, ap); } extern __typeof (__vfscanf) vfscanf attribute_hidden; weak_alias (__vfscanf, vfscanf) diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c index 38f654aa73..7560ec5bac 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c @@ -10,5 +10,5 @@ attribute_hidden weak_function vscanf (const char *fmt, va_list ap) { - return __nldbl__IO_vfscanf (stdin, fmt, ap, NULL); + return __nldbl_vfscanf (stdin, fmt, ap); } diff --git a/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c new file mode 100644 index 0000000000..0e38f24b5a --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c @@ -0,0 +1 @@ +#include "test-nldbl-fscanf-redirect.c" diff --git a/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c new file mode 100644 index 0000000000..507a3f4a7c --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c @@ -0,0 +1,98 @@ +/* Test fscanf/scanf/vfscanf/vscanf of long double as double without + <stdio.h>. + Copyright (C) 2024 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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 <string.h> + +#ifndef EXPECTED_LONG_DOUBLE_VALUE +# define EXPECTED_LONG_DOUBLE_VALUE 24.5 +#endif + +struct FILE; +extern struct FILE *stdin; +extern int fscanf (struct FILE *, const char *, ...); +extern int scanf (const char *, ...); +extern int vfscanf (struct FILE *, const char *, va_list); +extern int vscanf (const char *, va_list); +extern int printf (const char *format, ...); + +static int +wrap_vfscanf (struct FILE *fp, const char *format, ...) +{ + va_list ap; + va_start (ap, format); + int ret = vfscanf (fp, format, ap); + va_end (ap); + return ret; +} + +static int +wrap_vscanf (const char *format, ...) +{ + va_list ap; + va_start (ap, format); + int ret = vscanf (format, ap); + va_end (ap); + return ret; +} + +int +main (void) +{ + int n, i; + long double x; + char name[50]; + n = fscanf (stdin, "%d%Lf%s", &i, &x, name); + printf ("fscanf : n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", + n, i, x, name); + if (n != 3 + || i != 25 + || x != EXPECTED_LONG_DOUBLE_VALUE + || strcmp (name, "thompson")) + return 1; + + n = scanf ("%d%Lf%s", &i, &x, name); + printf ("scanf : n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", + n, i, x, name); + if (n != 3 + || i != 25 + || x != EXPECTED_LONG_DOUBLE_VALUE + || strcmp (name, "thompson")) + return 1; + + n = wrap_vfscanf (stdin, "%d%Lf%s", &i, &x, name); + printf ("vfscanf: n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", + n, i, x, name); + if (n != 3 + || i != 25 + || x != EXPECTED_LONG_DOUBLE_VALUE + || strcmp (name, "thompson")) + return 1; + + n = wrap_vscanf ("%d%Lf%s", &i, &x, name); + printf ("vscanf : n = %d, i = %d, x = %Lf, name = \"%.50s\"\n", + n, i, x, name); + if (n != 3 + || i != 25 + || x != EXPECTED_LONG_DOUBLE_VALUE + || strcmp (name, "thompson")) + return 1; + + return 0; +}
Changes in v3: 1. Don't change stdio-common/test-fscanf.c. 2. Don't include stdio-common/test-fscanf.c. 3. Move test input files to stdio-common. Changes in v2: 1. No need to include <nldbl-abi.h> in nldbl-compat.c. 2. Don't protect the __nldbl__IO_vfscanf compat symbol with #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) -- Fix BZ #31776 by 1. Making __nldbl__IO_vfscanf a compat symbol. 2. Remove _IO_vfscanf from libnldbl_nonshared.a. Since _IO_vfscanf is a compat symbol, there is no point to provide it in libnldbl_nonshared.a. 3. Change libnldbl_nonshared.a to call __nldbl_vfscanf, instead of __nldbl__IO_vfscanf. Add fscanf/scanf/vfscanf/vscanf tests of long double as double without including <stdio.h>. NB: Input files for fscanf tests must be under stdio-common. Otherwise, Rules won't pick them up. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> --- .../test-nldbl-fscanf-redirect-static.input | 4 + stdio-common/test-nldbl-fscanf-redirect.input | 4 + sysdeps/ieee754/ldbl-opt/Makefile | 12 ++- sysdeps/ieee754/ldbl-opt/nldbl-compat.c | 4 + sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c | 2 +- sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c | 13 --- sysdeps/ieee754/ldbl-opt/nldbl-scanf.c | 2 +- sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c | 2 +- sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c | 2 +- .../test-nldbl-fscanf-redirect-static.c | 1 + .../ldbl-opt/test-nldbl-fscanf-redirect.c | 98 +++++++++++++++++++ 11 files changed, 126 insertions(+), 18 deletions(-) create mode 100644 stdio-common/test-nldbl-fscanf-redirect-static.input create mode 100644 stdio-common/test-nldbl-fscanf-redirect.input delete mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c create mode 100644 sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect-static.c create mode 100644 sysdeps/ieee754/ldbl-opt/test-nldbl-fscanf-redirect.c