From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27666 invoked by alias); 4 Nov 2019 15:08:40 -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 27642 invoked by uid 89); 4 Nov 2019 15:08:40 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.7 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=IEEE, stdint.h, Printing, UD:wchar.h X-HELO: mx0b-001b2d01.pphosted.com Subject: Re: [PATCH v2 02/30] ldbl-128ibm-compat: Add wide character printing functions To: "Gabriel F. T. Gomes" , libc-alpha@sourceware.org References: <20191025153410.15405-1-gabriel@inconstante.net.br> <20191025153410.15405-3-gabriel@inconstante.net.br> From: Paul E Murphy Message-ID: <6cd56f3e-847f-f1bc-7ae4-f30d58bfdd0a@linux.ibm.com> Date: Mon, 04 Nov 2019 15:08: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-3-gabriel@inconstante.net.br> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2019-11/txt/msg00057.txt.bz2 On 10/25/19 10:33 AM, Gabriel F. T. Gomes wrote: > From: "Gabriel F. T. Gomes" > > No changes since v1. > > -- 8< -- > Similarly to what was done for regular character printing functions, > this patch uses the new mode mask, PRINTF_LDBL_USES_FLOAT128, in the > 'mode' argument of the wide characters printing function, > __vfwprintf_internal (which is also extended to support printing > floating-point values with IEEE binary128, by saving floating-point > values into variables of type __float128 and adjusting the parameters to > __printf_fp and __printf_fphex as if it was a call from a wide-character > version of strfromf128 (even though such version does not exist)). > > Tested for powerpc64le. > --- > sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 13 +- > sysdeps/ieee754/ldbl-128ibm-compat/Versions | 8 ++ > .../ldbl-128ibm-compat/ieee128-fwprintf.c | 35 ++++++ > .../ldbl-128ibm-compat/ieee128-swprintf.c | 36 ++++++ > .../ldbl-128ibm-compat/ieee128-vfwprintf.c | 27 +++++ > .../ldbl-128ibm-compat/ieee128-vswprintf.c | 28 +++++ > .../ldbl-128ibm-compat/ieee128-vwprintf.c | 27 +++++ > .../ldbl-128ibm-compat/ieee128-wprintf.c | 35 ++++++ > .../ldbl-128ibm-compat/test-wprintf-ibm128.c | 1 + > .../ldbl-128ibm-compat/test-wprintf-ieee128.c | 1 + > .../test-wprintf-ldbl-compat.c | 111 ++++++++++++++++++ > 11 files changed, 321 insertions(+), 1 deletion(-) > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c > > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile > index 89059f37e2..0f2f58d5b9 100644 > --- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile > @@ -11,7 +11,13 @@ ldbl-extra-routines += printf_size \ > vfprintf \ > vprintf \ > vsnprintf \ > - vsprintf > + vsprintf \ > + fwprintf \ > + swprintf \ > + wprintf \ > + vfwprintf \ > + vswprintf \ > + vwprintf > > # Printing long double values with IEEE binary128 format reuses part > # of the internal float128 implementation (__printf_fp, __printf_fphex, > @@ -19,6 +25,7 @@ ldbl-extra-routines += printf_size \ > # the following functions, must have -mfloat128 and -mabi=ibmlongdouble > # passed to the compiler. > CFLAGS-vfprintf-internal.c += -mfloat128 -mabi=ibmlongdouble > +CFLAGS-vfwprintf-internal.c += -mfloat128 -mabi=ibmlongdouble > > # Basic tests for the implementation of long double with IEEE binary128 > # format and for the related redirections in installed headers. > @@ -26,6 +33,10 @@ tests-internal += test-printf-ieee128 test-printf-ibm128 > CFLAGS-test-printf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi > CFLAGS-test-printf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi > > +tests-internal += test-wprintf-ieee128 test-wprintf-ibm128 > +CFLAGS-test-wprintf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi > +CFLAGS-test-wprintf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi > + > 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 6a27befed2..0485a2b5d4 100644 > --- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions > @@ -134,5 +134,13 @@ libc { > __vprintfieee128; > __vsnprintfieee128; > __vsprintfieee128; > + > + __fwprintfieee128; > + __swprintfieee128; > + __wprintfieee128; > + > + __vfwprintfieee128; > + __vswprintfieee128; > + __vwprintfieee128; > } > } Looks OK, and is consistent with committed patches. > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c The 6 wide-character printf wrappers look OK too. > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c > new file mode 100644 > index 0000000000..9e230cd6f8 > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c > @@ -0,0 +1 @@ > +#include > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c > new file mode 100644 > index 0000000000..9e230cd6f8 > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c > @@ -0,0 +1 @@ > +#include > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c > new file mode 100644 > index 0000000000..71edfec235 > --- /dev/null > +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c > @@ -0,0 +1,111 @@ > +/* Test for the long double variants of *w*printf functions. > + 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 > + . */ > + > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +static void > +do_test_call_varg (FILE *stream, const wchar_t *format, ...) > +{ > + wchar_t string[128]; > + va_list args; > + > + wprintf (L"%15Ls", L"vfwprintf: "); > + va_start (args, format); > + vfwprintf (stream, format, args); > + va_end (args); > + wprintf (L"\n"); > + > + wprintf (L"%15Ls", L"vswprintf: "); > + va_start (args, format); > + vswprintf (string, 127, format, args); > + va_end (args); > + wprintf (L"%Ls", string); > + wprintf (L"\n"); > + > + wprintf (L"%15Ls", L"vwprintf: "); > + va_start (args, format); > + vwprintf (format, args); > + va_end (args); > + wprintf (L"\n"); > +} > + > +static void > +do_test_call_rarg (FILE *stream, const wchar_t *format, long double ld) > +{ > + wchar_t string[128]; > + > + wprintf (L"%15Ls", L"fwprintf: "); > + fwprintf (stream, format, ld); > + wprintf (L"\n"); > + > + wprintf (L"%15Ls", L"swprintf: "); > + swprintf (string, 127, format, ld); > + wprintf (L"%Ls", string); > + wprintf (L"\n"); > + > + wprintf (L"%15Ls", L"wprintf: "); > + wprintf (format, ld); > + wprintf (L"\n"); > +} > + > +static void > +do_test_call (void) > +{ > + long double ld = -1; > + > + /* Print in decimal notation. */ > + do_test_call_rarg (stdout, L"%.10Lf", ld); > + do_test_call_varg (stdout, L"%.10Lf", ld); > + > + /* Print in hexadecimal notation. */ > + do_test_call_rarg (stdout, L"%.10La", ld); > + do_test_call_varg (stdout, L"%.10La", ld); > +} > + > +static int > +do_test (void) > +{ > + struct support_capture_subprocess result; > + result = support_capture_subprocess ((void *) &do_test_call, NULL); > + > + /* Compare against the expected output. */ > + const char *expected = > + " fwprintf: -1.0000000000\n" > + " swprintf: -1.0000000000\n" > + " wprintf: -1.0000000000\n" > + " vfwprintf: -1.0000000000\n" > + " vswprintf: -1.0000000000\n" > + " vwprintf: -1.0000000000\n" > + " fwprintf: -0x1.0000000000p+0\n" > + " swprintf: -0x1.0000000000p+0\n" > + " wprintf: -0x1.0000000000p+0\n" > + " vfwprintf: -0x1.0000000000p+0\n" > + " vswprintf: -0x1.0000000000p+0\n" > + " vwprintf: -0x1.0000000000p+0\n"; > + TEST_COMPARE_STRING (expected, result.out.buffer); > + > + return 0; > +} > + > +#include > Is it prohibitively difficult to merge the wide character tester with the one in the previous patch? Otherwise, this looks OK too.