From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 128216 invoked by alias); 8 Nov 2019 23:26:01 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 128207 invoked by uid 89); 8 Nov 2019 23:26:01 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.1 spammy=*string X-HELO: mx0a-001b2d01.pphosted.com Subject: Re: [PATCH v2 13/30] ldbl-128ibm-compat: Add ISO C99 versions of scanf functions To: "Gabriel F. T. Gomes" , libc-alpha@sourceware.org References: <20191025153410.15405-1-gabriel@inconstante.net.br> <20191025153410.15405-14-gabriel@inconstante.net.br> From: Paul E Murphy Message-ID: <9dfc38ae-4b23-d70b-73b8-4e7cacda438c@linux.ibm.com> Date: Fri, 08 Nov 2019 23:26:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.0 MIME-Version: 1.0 In-Reply-To: <20191025153410.15405-14-gabriel@inconstante.net.br> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2019-11/txt/msg00328.txt.bz2 On 10/25/19 10:33 AM, Gabriel F. T. Gomes wrote: > From: "Gabriel F. T. Gomes" > > 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 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. git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile OK > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions OK > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_fscanf.c ... The various wrappers all look OK. > +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 0000000000..70688ac2bb > --- /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 0000000000..70688ac2bb > --- /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. */ Indeed a hack. How frail is this? > +#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 0000000000..ffc7ca2aaa > --- /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) \ Should the pointer itself also be verified? > + 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 > 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 OK ysdeps/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 0000000000..6be29624d9 > --- /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 0000000000..6be29624d9 > --- /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. */ The same hack shows up four times, should it be isolated in one place? > +#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.l > 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 OK