From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 93468 invoked by alias); 9 Aug 2019 18:36:24 -0000 Mailing-List: contact glibc-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: , Sender: glibc-cvs-owner@sourceware.org List-Subscribe: Received: (qmail 93449 invoked by uid 10126); 9 Aug 2019 18:36:24 -0000 Date: Fri, 09 Aug 2019 18:36:00 -0000 Message-ID: <20190809183624.93448.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Gabriel F.T.Gomes To: glibc-cvs@sourceware.org Subject: [glibc/gabriel/powerpc-ieee128-printscan] ldbl-128ibm-compat: Add ISO C99 versions of scanf functions X-Act-Checkin: glibc X-Git-Author: Gabriel F. T. Gomes X-Git-Refname: refs/heads/gabriel/powerpc-ieee128-printscan X-Git-Oldrev: ee06790283060ba54e5b83e75e57e7288f50a971 X-Git-Newrev: 3a15cc582aa8a1a670f659655783daa60288c7f0 X-SW-Source: 2019-q3/txt/msg00220.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=3a15cc582aa8a1a670f659655783daa60288c7f0 commit 3a15cc582aa8a1a670f659655783daa60288c7f0 Author: Gabriel F. T. Gomes Date: Thu Jul 11 11:47:43 2019 -0300 ldbl-128ibm-compat: Add ISO C99 versions of scanf functions In the format string for *scanf functions, the '%as', '%aS', and '%a[]' modifiers behave differently depending on ISO C99 compatibility and on _GNU_SOURCE. When _GNU_SOURCE is not set and when in compatibility with ISO C99, these modifiers consume a floating-point argument. Otherwise, they behave like ascanf, and allocate memory for the output. This patch adds the IEEE binary128 variant of these functions for the third long double format on powerpc64le. Tested for powerpc64le. * sysdeps/ieee754/ldbl-128ibm-compat/Makefile [subdir == stdio-common] (ldbl-extra-routines): Add isoc99_fscanf, isoc99_scanf, isoc99_sscanf, isoc99_vfscanf, isoc99_vscanf, isoc99_vsscanf, [subdir == wcsmbs] (ldbl-extra-routines): Add isoc99_fwscanf, isoc99_swscanf, isoc99_wscanf, isoc99_vfwscanf, isoc99_vswscanf, and isoc99_vwscanf. [subdir == stdio-common] (tests-internal): Add test-isoc99-scanf-ieee128, test-isoc99-scanf-ibm128, test-isoc99-wscanf-ieee128, and test-isoc99-wscanf-ibm128. [subdir == stdio-common] (CFLAGS-test-isoc99-scanf-ieee128.c) (CFLAGS-test-isoc99-scanf-ibm128.c) (CFLAGS-test-isoc99-wscanf-ieee128.c) (CFLAGS-test-isoc99-wscanf-ibm128.c): New variable. [subdir == stdio-common] ($(objpfx)test-isoc99-scanf-ieee128) ($(objpfx)test-isoc99-wscanf-ieee128): Add $(f128-loader-link) to gnulib. [subdir == stdio-common] (tests-special): Add $(objpfx)test-isoc99-scanf-ieee128.out, $(objpfx)test-isoc99-scanf-ibm128.out, $(objpfx)test-isoc99-wscanf-ieee128.out, and $(objpfx)test-isoc99-wscanf-ibm128.out. ($(objpfx)test-isoc99-scanf-ieee128.out) ($(objpfx)test-isoc99-scanf-ibm128.out) ($(objpfx)test-isoc99-wscanf-ieee128.out) ($(objpfx)test-isoc99-wscanf-ibm128.out): New build and run rules. * sysdeps/ieee754/ldbl-128ibm-compat/Versions (libc): Add __isoc99_fscanfieee128, __isoc99_scanfieee128, __isoc99_sscanfieee128, __isoc99_vfscanfieee128, __isoc99_vscanfieee128, __isoc99_vsscanfieee128, __isoc99_fwscanfieee128, __isoc99_swscanfieee128, __isoc99_wscanfieee128, __isoc99_vfwscanfieee128, __isoc99_vswscanfieee128, and __isoc99_vwscanfieee128. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fscanf.c: New file. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fwscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_scanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_sscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfwscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vsscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vwscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_wscanf.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ibm128.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ieee128.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat-template.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ibm128.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ieee128.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ldbl-compat.c: Likewise. * sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c: Protect the declaration of variables based on ISO C99 feature test macros. Diff: --- sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 59 +++++++++- 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 | 13 +++ .../ldbl-128ibm-compat/test-isoc99-scanf-ieee128.c | 13 +++ .../test-isoc99-scanf-ldbl-compat-template.c | 119 +++++++++++++++++++++ .../test-isoc99-scanf-ldbl-compat.c | 10 ++ .../test-isoc99-scanf-ldbl-compat.sh | 53 +++++++++ .../ldbl-128ibm-compat/test-isoc99-wscanf-ibm128.c | 13 +++ .../test-isoc99-wscanf-ieee128.c | 13 +++ .../test-isoc99-wscanf-ldbl-compat.c | 10 ++ .../test-scanf-ldbl-compat-template.c | 4 + 23 files changed, 711 insertions(+), 1 deletion(-) diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile index c3ccb9a..af9dc08 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile @@ -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 diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions index dead38c..23c2fd9 100644 --- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions @@ -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; 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..3930170 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fscanf.c @@ -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 + . */ + +#include +#include + +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..d56ecfb --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fwscanf.c @@ -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 + . */ + +#include +#include + +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..5b643fb --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_scanf.c @@ -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 + . */ + +#include +#include + +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..480357c --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_sscanf.c @@ -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 + . */ + +#include +#include +#include + +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..e18779a --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c @@ -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 + . */ + +#include +#include +#include + +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..2d131f7 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfscanf.c @@ -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 + . */ + +#include + +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..a281ecc --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vfwscanf.c @@ -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 + . */ + +#include + +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..6ec60d5 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vscanf.c @@ -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 + . */ + +#include + +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..599e868 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vsscanf.c @@ -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 + . */ + +#include +#include + +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..3a28616 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c @@ -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 + . */ + +#include +#include +#include + +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..b9bd4a7 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vwscanf.c @@ -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 + . */ + +#include + +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..e78b4a3 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_wscanf.c @@ -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 + . */ + +#include +#include + +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..70688ac --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ibm128.c @@ -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 +#include +#include +#include + +#include 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..70688ac --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ieee128.c @@ -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 +#include +#include +#include + +#include diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat-template.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat-template.c new file mode 100644 index 0000000..ffc7ca2 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat-template.c @@ -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 + . */ + +#include +#include +#include +#include +#include + +#include + +#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 diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.c new file mode 100644 index 0000000..739b6bb --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.c @@ -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 diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh new file mode 100644 index 0000000..fc08bed --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-scanf-ldbl-compat.sh @@ -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 +# . + +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 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..6be2962 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ibm128.c @@ -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 +#include +#include +#include + +#include 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..6be2962 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ieee128.c @@ -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 +#include +#include +#include + +#include diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ldbl-compat.c new file mode 100644 index 0000000..3ad2964 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-isoc99-wscanf-ldbl-compat.c @@ -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 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 4590e9d..aea4f0d 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 @@ -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