public inbox for glibc-cvs@sourceware.org help / color / mirror / Atom feed
From: Gabriel F.T.Gomes <gftg@sourceware.org> To: glibc-cvs@sourceware.org Subject: [glibc/gabriel/powerpc-ieee128-printscan] ldbl-128ibm-compat: Add ISO C99 versions of scanf functions Date: Tue, 03 Dec 2019 17:03:00 -0000 [thread overview] Message-ID: <20191203170334.82310.qmail@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8a9f338591e27a72b179fec6a42d7469c6a55eb5 commit 8a9f338591e27a72b179fec6a42d7469c6a55eb5 Author: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com> Date: Thu Jul 11 11:47:43 2019 -0300 ldbl-128ibm-compat: Add ISO C99 versions of scanf functions Changes since v2: - Removed ugly hacks after rebase against commit ID 93486ba583ec. - Updated copyright years. - Unified test case for GNU and ISO C99 versions (got rid of many files in the process, including the new test template for C99). - Fixed http URLs. - Updated commit message. No changes since v1. -- 8< -- In the format string for *scanf functions, the '%as', '%aS', and '%a[]' modifiers behave differently depending on ISO C99 compatibility. When _GNU_SOURCE is defined and -std=c89 is passed to the compiler, these functions behave like ascanf, and the modifiers allocate memory for the output. Otherwise, the ISO C99 compliant version of these functions is used, and the modifiers consume a floating-point argument. This patch adds the IEEE binary128 variant of ISO C99 compliant functions for the third long double format on powerpc64le. Tested for powerpc64le. Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com> Diff: --- sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 57 ++++++++++++++++- sysdeps/ieee754/ldbl-128ibm-compat/Versions | 16 +++++ .../ldbl-128ibm-compat/ieee128-isoc99_fscanf.c | 35 +++++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_fwscanf.c | 35 +++++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_scanf.c | 35 +++++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_sscanf.c | 39 ++++++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_swscanf.c | 40 ++++++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_vfscanf.c | 27 ++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_vfwscanf.c | 27 ++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_vscanf.c | 27 ++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_vsscanf.c | 30 +++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c | 32 ++++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_vwscanf.c | 27 ++++++++ .../ldbl-128ibm-compat/ieee128-isoc99_wscanf.c | 35 +++++++++++ .../ldbl-128ibm-compat/test-isoc99-scanf-ibm128.c | 1 + .../ldbl-128ibm-compat/test-isoc99-scanf-ieee128.c | 1 + .../ldbl-128ibm-compat/test-isoc99-wscanf-ibm128.c | 1 + .../test-isoc99-wscanf-ieee128.c | 1 + .../test-scanf-ldbl-compat-template.c | 73 +++++++++++++--------- .../ldbl-128ibm-compat/test-scanf-ldbl-compat.c | 3 +- .../ldbl-128ibm-compat/test-scanf-ldbl-compat.sh | 16 ++--- .../ldbl-128ibm-compat/test-wscanf-ldbl-compat.c | 3 +- 22 files changed, 522 insertions(+), 39 deletions(-) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile index 21332bf..6d5414c 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile @@ -7,6 +7,13 @@ ldbl-extra-routines += fwscanf \ endif ifeq ($(subdir),wcsmbs) +ldbl-extra-routines += isoc99_fwscanf \ + isoc99_swscanf \ + isoc99_wscanf \ + isoc99_vfwscanf \ + isoc99_vswscanf \ + isoc99_vwscanf + tests-internal += test-wcstold-ibm128 test-wcstold-ieee128 CFLAGS-test-wcstold-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi CFLAGS-test-wcstold-ibm128.c += -mabi=ibmlongdouble -Wno-psabi @@ -43,7 +50,13 @@ ldbl-extra-routines += printf_size \ vfwscanf \ obprintf \ obstack_chk \ - vobstack_chk + vobstack_chk \ + 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, @@ -86,12 +99,30 @@ CFLAGS-test-wscanf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi -std=c89 -D_GNU_SO $(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: \ @@ -118,6 +149,30 @@ $(objpfx)test-wscanf-ibm128.out: \ $(SHELL) $^ '$(test-program-prefix)' $@; \ $(evaluate-test) +$(objpfx)test-isoc99-scanf-ieee128.out: \ + ../sysdeps/ieee754/ldbl-128ibm-compat/test-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-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-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-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 diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions index 1a774de..da8e0ce 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions @@ -191,6 +191,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; diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fscanf.c new file mode 100644 index 0000000..fd08613 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fscanf.c @@ -0,0 +1,35 @@ +/* Wrapper for __isoc99_fscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fwscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fwscanf.c new file mode 100644 index 0000000..8d5ef81 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fwscanf.c @@ -0,0 +1,35 @@ +/* Wrapper for __isoc99_fwscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_scanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_scanf.c new file mode 100644 index 0000000..87c9416 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_scanf.c @@ -0,0 +1,35 @@ +/* Wrapper for __isoc99_scanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_sscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_sscanf.c new file mode 100644 index 0000000..93be2f4 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_sscanf.c @@ -0,0 +1,39 @@ +/* Wrapper for __isoc99_sscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c new file mode 100644 index 0000000..da48f7e --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c @@ -0,0 +1,40 @@ +/* Wrapper for __isoc99_swscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfscanf.c new file mode 100644 index 0000000..00a018c --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfscanf.c @@ -0,0 +1,27 @@ +/* Wrapper for __isoc99_vfscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfwscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfwscanf.c new file mode 100644 index 0000000..6c1fbe7 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfwscanf.c @@ -0,0 +1,27 @@ +/* Wrapper for __isoc99_vfwscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vscanf.c new file mode 100644 index 0000000..fa0b901 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vscanf.c @@ -0,0 +1,27 @@ +/* Wrapper for __isoc99_vscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vsscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vsscanf.c new file mode 100644 index 0000000..bd59419 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vsscanf.c @@ -0,0 +1,30 @@ +/* Wrapper for __isoc99_vsscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c new file mode 100644 index 0000000..875ea1c --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c @@ -0,0 +1,32 @@ +/* Wrapper for __isoc99_vswscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vwscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vwscanf.c new file mode 100644 index 0000000..3bda9b3 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vwscanf.c @@ -0,0 +1,27 @@ +/* Wrapper for __isoc99_vwscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_wscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_wscanf.c new file mode 100644 index 0000000..734b0f1 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_wscanf.c @@ -0,0 +1,35 @@ +/* Wrapper for __isoc99_wscanf. IEEE128 version. + Copyright (C) 2019 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_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) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ibm128.c new file mode 100644 index 0000000..8cdee60 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ibm128.c @@ -0,0 +1 @@ +#include <test-scanf-ldbl-compat.c> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ieee128.c new file mode 100644 index 0000000..8cdee60 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ieee128.c @@ -0,0 +1 @@ +#include <test-scanf-ldbl-compat.c> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ibm128.c new file mode 100644 index 0000000..ef21fc4 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ibm128.c @@ -0,0 +1 @@ +#include <test-wscanf-ldbl-compat.c> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ieee128.c new file mode 100644 index 0000000..ef21fc4 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ieee128.c @@ -0,0 +1 @@ +#include <test-wscanf-ldbl-compat.c> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c index 3dbed79..9bdf6da 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c @@ -24,92 +24,109 @@ #include <support/check.h> -#define CLEAR \ +#define CLEAR_VARGS \ va_start (args, format); \ - ld = va_arg (args, long double *); \ - *ld = 0; \ + ldptr = va_arg (args, long double *); \ + fptr = va_arg (args, float *); \ + *ldptr = 0; \ + *fptr = 0; \ va_end (args); -#define CLEAR_VALUE value = 0; - -#define CHECK \ +#define CHECK_VARGS \ va_start (args, format); \ - ld = va_arg (args, long double *); \ + ldptr = va_arg (args, long double *); \ + fptr = va_arg (args, float *); \ va_end (args); \ - if (*ld == -1.0L) \ + if (*ldptr == -1 && *fptr == -2) \ printf ("OK"); \ else \ - printf ("ERROR (%.60Lf)", *ld); \ + printf ("ERROR (%Lf %f)", *ldptr, *fptr); \ printf ("\n"); +#define CLEAR_VALUE \ + ld = 0; \ + f = 0; + #define CHECK_VALUE \ - if (value == -1.0L) \ + if (ld == -1 && f == -2) \ printf ("OK"); \ else \ - printf ("ERROR (%.60Lf)", value); \ + printf ("ERROR (%Lf %f)", ld, f); \ printf ("\n"); static void do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...) { - long double value; - long double *ld; + float f; + long double ld; + float *fptr; + long double *ldptr; va_list args; CLEAR_VALUE printf ("fscanf: "); - FSCANF (stream, format, &value); + FSCANF (stream, format, &ld, &f); CHECK_VALUE CLEAR_VALUE printf ("scanf: "); - SCANF (format, &value); + SCANF (format, &ld, &f); CHECK_VALUE CLEAR_VALUE printf ("sscanf: "); - SSCANF (string, format, &value); + SSCANF (string, format, &ld, &f); CHECK_VALUE - CLEAR + CLEAR_VARGS printf ("vfscanf: "); va_start (args, format); VFSCANF (stream, format, args); va_end (args); - CHECK + CHECK_VARGS - CLEAR + CLEAR_VARGS printf ("vscanf: "); va_start (args, format); VSCANF (format, args); va_end (args); - CHECK + CHECK_VARGS - CLEAR + CLEAR_VARGS printf ("vsscanf: "); va_start (args, format); VSSCANF (string, format, args); va_end (args); - CHECK + CHECK_VARGS } static int do_test (void) { CHAR string[256]; + float f; long double ld; /* Scan in decimal notation. */ STRCPY (string, - L ("-1.0\n") - L ("-1.0\n") ); - do_test_call (stdin, string, L("%Lf"), &ld); + L ("-1.0 -2.0\n") + L ("-1.0 -2.0\n") ); + do_test_call (stdin, string, L("%Lf %f"), &ld, &f); /* Scan in hexadecimal notation. */ STRCPY (string, - L ("-0x1.0p+0\n") - L ("-0x1.0p+0\n") ); - do_test_call (stdin, string, L("%La"), &ld); + L ("-0x1.0p+0 -0x2.0p+0\n") + L ("-0x1.0p+0 -0x2.0p+0\n") ); + /* For ISO C99, scan the single-precision value with "%as" to test + that __isoc99_*scanf ignores the 's'. For DEPRECATED_SCANF, do not + use "%as", because that would try to scan a string and allocate + space for it. */ +#if __GLIBC_USE (DEPRECATED_SCANF) +# define FMT "%La %a" +#else +# define FMT "%La %as" +#endif + do_test_call (stdin, string, L(FMT), &ld, &f); return 0; } diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.c index 116808d..e25652c 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.c +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.c @@ -3,7 +3,8 @@ #include <libio/stdio.h> #define CHAR char -#define L(x) x +#define Lx(x) x +#define L(x) Lx (x) #define FSCANF fscanf #define SSCANF sscanf #define SCANF scanf diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.sh b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.sh index 908c346..e022120 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.sh +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.sh @@ -26,14 +26,14 @@ test_program_output=$1; shift status=0 cat <<'EOF' | --1.000000000000000000000000000000000000000000000000000000000000 --1.000000000000000000000000000000000000000000000000000000000000 --1.000000000000000000000000000000000000000000000000000000000000 --1.000000000000000000000000000000000000000000000000000000000000 --0x1.000000000000000000000000000000000000000000000000000000000000p+0 --0x1.000000000000000000000000000000000000000000000000000000000000p+0 --0x1.000000000000000000000000000000000000000000000000000000000000p+0 --0x1.000000000000000000000000000000000000000000000000000000000000p+0 +-0x1.0p+0 -0x2.0p+0 +-0x1.0p+0 -0x2.0p+0 +-0x1.0p+0 -0x2.0p+0 +-0x1.0p+0 -0x2.0p+0 +-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} \ diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wscanf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wscanf-ldbl-compat.c index 4b8fd1b..b8152aa 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/test-wscanf-ldbl-compat.c +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wscanf-ldbl-compat.c @@ -3,7 +3,8 @@ #include <libio/stdio.h> #define CHAR wchar_t -#define L(x) L##x +#define Lx(x) L##x +#define L(x) Lx (x) #define FSCANF fwscanf #define SSCANF swscanf #define SCANF wscanf
next reply other threads:[~2019-12-03 17:03 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-12-03 17:03 Gabriel F.T.Gomes [this message] -- strict thread matches above, loose matches on Subject: below -- 2019-10-25 15:33 Gabriel F.T.Gomes 2019-10-15 19:02 Gabriel F.T.Gomes 2019-08-09 18:36 Gabriel F.T.Gomes
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=20191203170334.82310.qmail@sourceware.org \ --to=gftg@sourceware.org \ --cc=glibc-cvs@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: linkBe 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).