This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2 13/30] ldbl-128ibm-compat: Add ISO C99 versions of scanf functions
- From: Paul E Murphy <murphyp at linux dot ibm dot com>
- To: "Gabriel F. T. Gomes" <gabriel at inconstante dot net dot br>, libc-alpha at sourceware dot org
- Date: Fri, 8 Nov 2019 17:25:44 -0600
- Subject: Re: [PATCH v2 13/30] ldbl-128ibm-compat: Add ISO C99 versions of scanf functions
- References: <20191025153410.15405-1-gabriel@inconstante.net.br> <20191025153410.15405-14-gabriel@inconstante.net.br>
On 10/25/19 10:33 AM, Gabriel F. T. Gomes wrote:
From: "Gabriel F. T. Gomes" <gabrielftg@linux.ibm.com>
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 <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-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 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 <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-scanf-ldbl-compat.c>
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
+ <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) \
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 <support/test-driver.c>
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 <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-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 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 <libio/stdio.h>
+#include <stdlib/stdlib.h>
+#include <string/string.h>
+#include <wcsmbs/wchar.h>
+
+#include <test-isoc99-wscanf-ldbl-compat.c>
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