@@ -6,6 +6,15 @@ ldbl-extra-routines += fwscanf \
vwscanf
endif
+ifeq ($(subdir),wcsmbs)
+ldbl-extra-routines += isoc99_fwscanf \
+ isoc99_swscanf \
+ isoc99_wscanf \
+ isoc99_vfwscanf \
+ isoc99_vswscanf \
+ isoc99_vwscanf
+endif
+
ifeq ($(subdir),stdio-common)
ldbl-extra-routines += printf_size \
asprintf \
@@ -32,7 +41,13 @@ ldbl-extra-routines += printf_size \
vfscanf \
vscanf \
vsscanf \
- vfwscanf
+ vfwscanf \
+ isoc99_fscanf \
+ isoc99_scanf \
+ isoc99_sscanf \
+ isoc99_vfscanf \
+ isoc99_vscanf \
+ isoc99_vsscanf
# Printing long double values with IEEE binary128 format reuses part
# of the internal float128 implementation (__printf_fp, __printf_fphex,
@@ -67,12 +82,30 @@ CFLAGS-test-wscanf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
$(objpfx)test-wscanf-ieee128: gnulib-tests += $(f128-loader-link)
+tests-internal += test-isoc99-scanf-ieee128 test-isoc99-scanf-ibm128
+CFLAGS-test-isoc99-scanf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi -std=c99
+CFLAGS-test-isoc99-scanf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi -std=c99
+
+$(objpfx)test-isoc99-scanf-ieee128: gnulib-tests += $(f128-loader-link)
+
+tests-internal += test-isoc99-wscanf-ieee128 test-isoc99-wscanf-ibm128
+CFLAGS-test-isoc99-wscanf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi -std=c99
+CFLAGS-test-isoc99-wscanf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi -std=c99
+
+$(objpfx)test-isoc99-wscanf-ieee128: gnulib-tests += $(f128-loader-link)
+
ifeq ($(run-built-tests),yes)
tests-special += $(objpfx)test-scanf-ieee128.out
tests-special += $(objpfx)test-scanf-ibm128.out
tests-special += $(objpfx)test-wscanf-ieee128.out
tests-special += $(objpfx)test-wscanf-ibm128.out
+
+tests-special += $(objpfx)test-isoc99-scanf-ieee128.out
+tests-special += $(objpfx)test-isoc99-scanf-ibm128.out
+
+tests-special += $(objpfx)test-isoc99-wscanf-ieee128.out
+tests-special += $(objpfx)test-isoc99-wscanf-ibm128.out
endif
$(objpfx)test-scanf-ieee128.out: \
@@ -99,6 +132,30 @@ $(objpfx)test-wscanf-ibm128.out: \
$(SHELL) $^ '$(test-program-prefix)' $@; \
$(evaluate-test)
+$(objpfx)test-isoc99-scanf-ieee128.out: \
+ ../sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh \
+ $(objpfx)test-isoc99-scanf-ieee128
+ $(SHELL) $^ '$(test-program-prefix)' $@; \
+ $(evaluate-test)
+
+$(objpfx)test-isoc99-scanf-ibm128.out: \
+ ../sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh \
+ $(objpfx)test-isoc99-scanf-ibm128
+ $(SHELL) $^ '$(test-program-prefix)' $@; \
+ $(evaluate-test)
+
+$(objpfx)test-isoc99-wscanf-ieee128.out: \
+ ../sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh \
+ $(objpfx)test-isoc99-wscanf-ieee128
+ $(SHELL) $^ '$(test-program-prefix)' $@; \
+ $(evaluate-test)
+
+$(objpfx)test-isoc99-wscanf-ibm128.out: \
+ ../sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh \
+ $(objpfx)test-isoc99-wscanf-ibm128
+ $(SHELL) $^ '$(test-program-prefix)' $@; \
+ $(evaluate-test)
+
tests-internal += test-printf-size-ieee128 test-printf-size-ibm128
CFLAGS-test-printf-size-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
CFLAGS-test-printf-size-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
@@ -181,6 +181,22 @@ libc {
__vswscanfieee128;
__vwscanfieee128;
+ __isoc99_fscanfieee128;
+ __isoc99_scanfieee128;
+ __isoc99_sscanfieee128;
+
+ __isoc99_vfscanfieee128;
+ __isoc99_vscanfieee128;
+ __isoc99_vsscanfieee128;
+
+ __isoc99_fwscanfieee128;
+ __isoc99_swscanfieee128;
+ __isoc99_wscanfieee128;
+
+ __isoc99_vfwscanfieee128;
+ __isoc99_vswscanfieee128;
+ __isoc99_vwscanfieee128;
+
__argp_errorieee128;
__argp_failureieee128;
new file mode 100644
@@ -0,0 +1,35 @@
+/* Wrapper for __isoc99_fscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern int
+___ieee128_isoc99_fscanf (FILE *fp, const char *format, ...)
+{
+ va_list arg;
+ int done;
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+
+ va_start (arg, format);
+ done = __vfscanf_internal (fp, format, arg, mode_flags);
+ va_end (arg);
+
+ return done;
+}
+strong_alias (___ieee128_isoc99_fscanf, __isoc99_fscanfieee128)
new file mode 100644
@@ -0,0 +1,35 @@
+/* Wrapper for __isoc99_fwscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libioP.h>
+
+extern int
+___ieee128_isoc99_fwscanf (FILE *fp, const wchar_t *format, ...)
+{
+ va_list ap;
+ int done;
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+
+ va_start (ap, format);
+ done = __vfwscanf_internal (fp, format, ap, mode_flags);
+ va_end (ap);
+
+ return done;
+}
+strong_alias (___ieee128_isoc99_fwscanf, __isoc99_fwscanfieee128)
new file mode 100644
@@ -0,0 +1,35 @@
+/* Wrapper for __isoc99_scanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern int
+___ieee128_isoc99_scanf (const char *format, ...)
+{
+ va_list arg;
+ int done;
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+
+ va_start (arg, format);
+ done = __vfscanf_internal (stdin, format, arg, mode_flags);
+ va_end (arg);
+
+ return done;
+}
+strong_alias (___ieee128_isoc99_scanf, __isoc99_scanfieee128)
new file mode 100644
@@ -0,0 +1,39 @@
+/* Wrapper for __isoc99_sscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <strfile.h>
+#include <libioP.h>
+
+extern int
+___ieee128_isoc99_sscanf (const char *string, const char *format, ...)
+{
+ va_list arg;
+ int done;
+ int mode_flags = SCANF_ISOC99_A | 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_isoc99_sscanf, __isoc99_sscanfieee128)
new file mode 100644
@@ -0,0 +1,40 @@
+/* Wrapper for __isoc99_swscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <strfile.h>
+#include <libioP.h>
+
+extern int
+___ieee128_isoc99_swscanf (const wchar_t *string, const wchar_t *format, ...)
+{
+ va_list ap;
+ int done;
+ int mode_flags = SCANF_ISOC99_A | 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_isoc99_swscanf, __isoc99_swscanfieee128)
new file mode 100644
@@ -0,0 +1,27 @@
+/* Wrapper for __isoc99_vfscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <libio/libioP.h>
+
+extern int
+___ieee128_isoc99_vfscanf (FILE *fp, const char *format, va_list ap)
+{
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+ return __vfscanf_internal (fp, format, ap, mode_flags);
+}
+strong_alias (___ieee128_isoc99_vfscanf, __isoc99_vfscanfieee128)
new file mode 100644
@@ -0,0 +1,27 @@
+/* Wrapper for __isoc99_vfwscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <libioP.h>
+
+extern int
+___ieee128_isoc99_vfwscanf (FILE *fp, const wchar_t *format, va_list ap)
+{
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+ return __vfwscanf_internal (fp, format, ap, mode_flags);
+}
+strong_alias (___ieee128_isoc99_vfwscanf, __isoc99_vfwscanfieee128)
new file mode 100644
@@ -0,0 +1,27 @@
+/* Wrapper for __isoc99_vscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <libio/libioP.h>
+
+extern int
+___ieee128_isoc99_vscanf (const char *format, va_list ap)
+{
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+ return __vfscanf_internal (stdin, format, ap, mode_flags);
+}
+strong_alias (___ieee128_isoc99_vscanf, __isoc99_vscanfieee128)
new file mode 100644
@@ -0,0 +1,30 @@
+/* Wrapper for __isoc99_vsscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <strfile.h>
+#include <libioP.h>
+
+extern int
+___ieee128_isoc99_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_LDBL_USES_FLOAT128;
+ return __vfscanf_internal (fp, format, ap, mode_flags);
+}
+strong_alias (___ieee128_isoc99_vsscanf, __isoc99_vsscanfieee128)
new file mode 100644
@@ -0,0 +1,32 @@
+/* Wrapper for __isoc99_vswscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <libioP.h>
+#include <wchar.h>
+#include <strfile.h>
+
+extern int
+___ieee128_isoc99_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_LDBL_USES_FLOAT128;
+ return __vfwscanf_internal (fp, format, ap, mode_flags);
+}
+strong_alias (___ieee128_isoc99_vswscanf, __isoc99_vswscanfieee128)
new file mode 100644
@@ -0,0 +1,27 @@
+/* Wrapper for __isoc99_vwscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <libioP.h>
+
+extern int
+___ieee128_isoc99_vwscanf (const wchar_t *format, va_list ap)
+{
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+ return __vfwscanf_internal (stdin, format, ap, mode_flags);
+}
+strong_alias (___ieee128_isoc99_vwscanf, __isoc99_vwscanfieee128)
new file mode 100644
@@ -0,0 +1,35 @@
+/* Wrapper for __isoc99_wscanf. IEEE128 version.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libioP.h>
+
+extern int
+___ieee128_isoc99_wscanf (const wchar_t *format, ...)
+{
+ va_list ap;
+ int done;
+ int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
+
+ va_start (ap, format);
+ done = __vfwscanf_internal (stdin, format, ap, mode_flags);
+ va_end (ap);
+
+ return done;
+}
+strong_alias (___ieee128_isoc99_wscanf, __isoc99_wscanfieee128)
new file mode 100644
@@ -0,0 +1,13 @@
+#undef _GNU_SOURCE
+/* The following macro definitions are a hack. They word around disabling
+ the GNU extension while still using a few internal headers. */
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+#define u_long unsigned long
+#include <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-scanf-ldbl-compat.c>
new file mode 100644
@@ -0,0 +1,13 @@
+#undef _GNU_SOURCE
+/* The following macro definitions are a hack. They word around disabling
+ the GNU extension while still using a few internal headers. */
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+#define u_long unsigned long
+#include <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-scanf-ldbl-compat.c>
new file mode 100644
@@ -0,0 +1,119 @@
+/* Test for the long double variants of __isoc99_*scanf functions.
+ Copyright (C) 2018 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <wchar.h>
+
+#include <support/check.h>
+
+#define CLEAR_VARGS \
+ va_start (args, format); \
+ ldptr = va_arg (args, long double *); \
+ fptr = va_arg (args, float *); \
+ *ldptr = 0; \
+ *fptr = 0; \
+ va_end (args);
+
+#define CHECK_VARGS \
+ va_start (args, format); \
+ ldptr = va_arg (args, long double *); \
+ fptr = va_arg (args, float *); \
+ va_end (args); \
+ if (*ldptr == -1 && *fptr == -2) \
+ printf ("OK"); \
+ else \
+ printf ("ERROR (%Lf %f)", *ldptr, *fptr); \
+ printf ("\n");
+
+#define CLEAR_VALUE \
+ ld = 0; \
+ f = 0;
+
+#define CHECK_VALUE \
+ if (ld == -1 && f == -2) \
+ printf ("OK"); \
+ else \
+ printf ("ERROR (%Lf %f)", ld, f); \
+ printf ("\n");
+
+static void
+do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...)
+{
+ float *fptr;
+ float f;
+ long double *ldptr;
+ long double ld;
+ va_list args;
+
+ CLEAR_VALUE
+ printf ("fscanf: ");
+ FSCANF (stream, format, &ld, &f);
+ CHECK_VALUE
+
+ CLEAR_VALUE
+ printf ("scanf: ");
+ SCANF (format, &ld, &f);
+ CHECK_VALUE
+
+ CLEAR_VALUE
+ printf ("sscanf: ");
+ SSCANF (string, format, &ld, &f);
+ CHECK_VALUE
+
+ CLEAR_VARGS
+ printf ("vfscanf: ");
+ va_start (args, format);
+ VFSCANF (stream, format, args);
+ va_end (args);
+ CHECK_VARGS
+
+ CLEAR_VARGS
+ printf ("vscanf: ");
+ va_start (args, format);
+ VSCANF (format, args);
+ va_end (args);
+ CHECK_VARGS
+
+ CLEAR_VARGS
+ printf ("vsscanf: ");
+ va_start (args, format);
+ VSSCANF (string, format, args);
+ va_end (args);
+ CHECK_VARGS
+}
+
+static int
+do_test (void)
+{
+ CHAR string[256];
+ float f;
+ long double ld;
+
+ /* Scan floating-point value with '%as'. */
+ STRCPY (string,
+ L ("-0x1.0p+0 -0x2.0p+0\n")
+ L ("-0x1.0p+0 -0x2.0p+0\n") );
+ do_test_call (stdin, string, L("%La %as"), &ld, &f);
+
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1,10 @@
+#define CHAR char
+#define L(x) x
+#define FSCANF fscanf
+#define SSCANF sscanf
+#define SCANF scanf
+#define VFSCANF vfscanf
+#define VSSCANF vsscanf
+#define VSCANF vscanf
+#define STRCPY strcpy
+#include <test-isoc99-scanf-ldbl-compat-template.c>
new file mode 100644
@@ -0,0 +1,53 @@
+#!/bin/sh
+# Testing of __isoc99_*scanf. IEEE binary128 for powerpc64le version.
+# Copyright (C) 2018 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
+# <http://www.gnu.org/licenses/>.
+
+set -e
+
+test_program=$1; shift
+test_program_prefix=$1; shift
+test_program_output=$1; shift
+
+status=0
+
+cat <<'EOF' |
+-0x1.0p+0 -0x2.0p+0
+-0x1.0p+0 -0x2.0p+0
+-0x1.0p+0 -0x2.0p+0
+-0x1.0p+0 -0x2.0p+0
+EOF
+${test_program_prefix} \
+ ${test_program} \
+ - \
+ > ${test_program_output} || status=1
+
+cat <<'EOF' |
+fscanf: OK
+scanf: OK
+sscanf: OK
+vfscanf: OK
+vscanf: OK
+vsscanf: OK
+EOF
+cmp - ${test_program_output} > /dev/null 2>&1 ||
+{
+ status=1
+ echo "*** output comparison failed"
+}
+
+exit $status
new file mode 100644
@@ -0,0 +1,13 @@
+#undef _GNU_SOURCE
+/* The following macro definitions are a hack. They word around disabling
+ the GNU extension while still using a few internal headers. */
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+#define u_long unsigned long
+#include <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-wscanf-ldbl-compat.c>
new file mode 100644
@@ -0,0 +1,13 @@
+#undef _GNU_SOURCE
+/* The following macro definitions are a hack. They word around disabling
+ the GNU extension while still using a few internal headers. */
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+#define u_long unsigned long
+#include <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-wscanf-ldbl-compat.c>
new file mode 100644
@@ -0,0 +1,10 @@
+#define CHAR wchar_t
+#define L(x) L##x
+#define FSCANF fwscanf
+#define SSCANF swscanf
+#define SCANF wscanf
+#define VFSCANF vfwscanf
+#define VSSCANF vswscanf
+#define VSCANF vwscanf
+#define STRCPY wcscpy
+#include <test-isoc99-scanf-ldbl-compat-template.c>
@@ -53,8 +53,10 @@ static void
do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...)
{
long double value;
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
long double *ld;
va_list args;
+#endif
CLEAR_VALUE
printf ("fscanf: ");
@@ -71,6 +73,7 @@ do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...)
SSCANF (string, format, &value);
CHECK_VALUE
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
CLEAR
printf ("vfscanf: ");
va_start (args, format);
@@ -91,6 +94,7 @@ do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...)
VSSCANF (string, format, args);
va_end (args);
CHECK
+#endif
}
static int