public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 2/3] Refactor strtod tests
  2016-08-30 15:08 [PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes
@ 2016-08-30 15:07 ` Gabriel F. T. Gomes
  2016-08-30 15:08 ` [PATCH v2 3/3] Add tests for strfrom functions Gabriel F. T. Gomes
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Gabriel F. T. Gomes @ 2016-08-30 15:07 UTC (permalink / raw)
  To: libc-alpha

From: Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>

This patch changes strtod* tests to use strfrom* functions.

2016-08-30  Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>

	* stdlib/bug-strtod.c: Refactor based on GEN_TEST_STRTOD_FOREACH.
	* stdlib/bug-strtod2.c: Likewise.
	* stdlib/tst-strtod-round-skeleton.c: Likewise.
	* stdlib/tst-strtod6.c: Likewise.
	* stdlib/tst-strtod.h (GEN_TEST_STRTOD_FOREACH): Use strfrom.
---
 stdlib/bug-strtod.c                |  6 +++---
 stdlib/bug-strtod2.c               |  2 +-
 stdlib/tst-strtod-round-skeleton.c | 24 +++++++++++-------------
 stdlib/tst-strtod.h                |  7 +++----
 stdlib/tst-strtod6.c               |  2 +-
 5 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/stdlib/bug-strtod.c b/stdlib/bug-strtod.c
index c8b56aa..ac5193e 100644
--- a/stdlib/bug-strtod.c
+++ b/stdlib/bug-strtod.c
@@ -23,7 +23,7 @@
 
 #include "tst-strtod.h"
 
-#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF)		\
+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF)			\
 static int								\
 test_strto ## FSUF (void)						\
 {									\
@@ -45,8 +45,8 @@ test_strto ## FSUF (void)						\
 	{								\
 	  char fstr[FSTRLENMAX];					\
 	  char fcntstr[FSTRLENMAX];					\
-	  FTOSTR (fstr, sizeof (fstr), "%" FTOSTRM "g", f);		\
-	  FTOSTR (fcntstr, sizeof (fstr), "%" FTOSTRM "g", (FTYPE) cnt); \
+	  FTOSTR (fstr, sizeof (fstr), "%g", f);			\
+	  FTOSTR (fcntstr, sizeof (fstr), "%g", (FTYPE) cnt); 		\
 	  printf ("strto" #FSUF "(\"%s\") "				\
 		  "failed for cnt == %d (%s instead of %s)\n",		\
 		  buf, cnt, fstr, fcntstr);				\
diff --git a/stdlib/bug-strtod2.c b/stdlib/bug-strtod2.c
index cd13e9a..6128f2d 100644
--- a/stdlib/bug-strtod2.c
+++ b/stdlib/bug-strtod2.c
@@ -12,7 +12,7 @@ static const char *tests[] =
   };
 #define ntests (sizeof (tests) / sizeof (tests[0]))
 
-#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF)		\
+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF)			\
 static int								\
 test_strto ## FSUF (void)						\
 {									\
diff --git a/stdlib/tst-strtod-round-skeleton.c b/stdlib/tst-strtod-round-skeleton.c
index 1853c52..2e99dbd 100644
--- a/stdlib/tst-strtod-round-skeleton.c
+++ b/stdlib/tst-strtod-round-skeleton.c
@@ -58,11 +58,11 @@
 
 /* Generator to create an FTYPE member variabled named FSUF
    used to populate struct member variables.  */
-#define FTYPE_MEMBER(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF)  \
+#define FTYPE_MEMBER(FSUF, FTYPE, FTOSTR, LSUF, CSUF)  \
        FTYPE FSUF;
 
 /* Likewise, but each member is of type bool.  */
-#define BOOL_MEMBER(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF)  \
+#define BOOL_MEMBER(FSUF, FTYPE, FTOSTR, LSUF, CSUF)  \
        bool FSUF;
 
 #define STRUCT_FOREACH_FLOAT_FTYPE GEN_TEST_STRTOD_FOREACH (FTYPE_MEMBER)
@@ -96,13 +96,13 @@
 /* long double is special, and handled above.  */
 
 /* Selector for expected result field of a given type.  */
-#define _ENTRY(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF, ...)  \
+#define _ENTRY(FSUF, FTYPE, FTOSTR, LSUF, CSUF, ...)  \
   CONCAT (CHOOSE_ ## FSUF (__VA_ARGS__), LSUF),
 #define ENTRY(...) \
   GEN_TEST_STRTOD_FOREACH (_ENTRY, __VA_ARGS__)
 
 /* Selector for boolean exact tag of expected results.  */
-#define _XNTRY(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF, ...)  \
+#define _XNTRY(FSUF, FTYPE, FTOSTR, LSUF, CSUF, ...)  \
   CHOOSE_ ## FSUF (__VA_ARGS__),
 #define XNTRY(...) \
   GEN_TEST_STRTOD_FOREACH (_XNTRY, __VA_ARGS__)
@@ -157,21 +157,19 @@ struct test {
 #define STR(x) STRX (x)
 #define FNPFXS STR (FNPFX)
 
-#define GEN_ONE_TEST(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF)	\
+#define GEN_ONE_TEST(FSUF, FTYPE, FTOSTR, LSUF, CSUF)		\
 {								\
   FTYPE f = STRTO (FSUF) (s, NULL);				\
   if (f != expected->FSUF					\
       || (copysign ## CSUF) (1.0 ## LSUF, f)			\
 	 != (copysign ## CSUF) (1.0 ## LSUF, expected->FSUF))	\
     {								\
-      CHAR efstr[FSTRLENMAX];					\
-      CHAR fstr[FSTRLENMAX];					\
-      FTOSTR (efstr, FSTRLENMAX, L_("%") L_(FTOSTRM) L_("a"),   \
-	      expected->FSUF);    				\
-      FTOSTR (fstr, FSTRLENMAX, L_("%") L_(FTOSTRM) L_("a"), f);\
-      printf (FNPFXS "to" #FSUF  " (" STRM ") returned " STRM   \
-	      " not " STRM " (%s)\n",				\
-	      s, fstr, efstr, mode_name);			\
+      char efstr[FSTRLENMAX];					\
+      char fstr[FSTRLENMAX];					\
+      FTOSTR (efstr, FSTRLENMAX, "%a", expected->FSUF);		\
+      FTOSTR (fstr, FSTRLENMAX, "%a", f);			\
+      printf (FNPFXS "to" #FSUF  " (" STRM ") returned %s not "	\
+	      "%s (%s)\n", s, fstr, efstr, mode_name);		\
       if (ROUNDING_TESTS (FTYPE, rnd_mode) || exact->FSUF)	\
 	result = 1;						\
       else							\
diff --git a/stdlib/tst-strtod.h b/stdlib/tst-strtod.h
index 607cf39..b8e9cd4 100644
--- a/stdlib/tst-strtod.h
+++ b/stdlib/tst-strtod.h
@@ -23,14 +23,13 @@
 
 /* Splat n variants of the same test for the various strtod functions.  */
 #define GEN_TEST_STRTOD_FOREACH(mfunc, ...)			 \
-    mfunc (  f,       float, snprintf,  "", f, f, ##__VA_ARGS__) \
-    mfunc (  d,      double, snprintf,  "",  ,  , ##__VA_ARGS__) \
-    mfunc ( ld, long double, snprintf, "L", L, l, ##__VA_ARGS__)
+    mfunc (  f,       float, strfromf, f, f, ##__VA_ARGS__)	 \
+    mfunc (  d,      double, strfromd,  ,  , ##__VA_ARGS__)	 \
+    mfunc ( ld, long double, strfroml, L, l, ##__VA_ARGS__)
 /* The arguments to the generated macros are:
    FSUF - Function suffix
    FTYPE - float type
    FTOSTR - float to string func
-   FTOSTRM - Optional modifier for FTOSTR format
    LSUF - Literal suffix
    CSUF - C standardish suffix for many of the math functions
 */
diff --git a/stdlib/tst-strtod6.c b/stdlib/tst-strtod6.c
index 6b3bb84..9bfbdc2 100644
--- a/stdlib/tst-strtod6.c
+++ b/stdlib/tst-strtod6.c
@@ -5,7 +5,7 @@
 
 #include "tst-strtod.h"
 
-#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF) \
+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF)	  \
 static int						  \
 test_strto ## FSUF (const char str[])			  \
 {							  \
-- 
2.4.11

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/3] Add strfromd, strfromf, and strfroml functions
  2016-08-30 15:08 [PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes
  2016-08-30 15:07 ` [PATCH v2 2/3] Refactor strtod tests Gabriel F. T. Gomes
  2016-08-30 15:08 ` [PATCH v2 3/3] Add tests for strfrom functions Gabriel F. T. Gomes
@ 2016-08-30 15:08 ` Gabriel F. T. Gomes
  2016-09-16 23:23   ` Joseph Myers
  2016-09-16 18:14 ` [PING][PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes
  3 siblings, 1 reply; 8+ messages in thread
From: Gabriel F. T. Gomes @ 2016-08-30 15:08 UTC (permalink / raw)
  To: libc-alpha

ISO/IEC TS 18661-1 adds several functions in the strfrom family to stdlib.
This patch adds strfromd, strfromf, and strfroml.  This is being done in
preparation for the new floating-point type, float128.  The added functions
convert a floating-point value into a string, with configurable format.

2016-06-23  Gabriel F. T. Gomes  <gftg@linux.vnet.ibm.com>

	* NEWS: Mention the addition of strfromd, strfromf, and strfroml.
	* manual/arith.texi: Document strfromd, strfromf, strfroml.
	* stdlib/Makefile: Add strfromd, strfromf, and strfroml.
	* stdlib/Versions (GLIBC_2.25): Add strfromd, strfromf, and strfroml.
	* stdlib/stdlib.h (strfromd): New declaration.
	(strfromf): Likewise.
	(strfroml): Likewise.
	* stdlib/strfrom-skeleton.c: New file.  Generic implementation for
	strfrom.
	* stdlib/strfromd.c: New file.
	* stdlib/strfromf.c: Likewise.
	* stdlib/strfroml.c: Likewise.
	* sysdeps/arm/nacl/libc.abilist: Update.
	* sysdeps/unix/sysv/linux/aarch64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/arm/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/hppa/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/i386/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/nios2/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sh/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
---
 NEWS                                               |   3 +
 manual/arith.texi                                  |  41 ++++++
 stdlib/Makefile                                    |   7 +
 stdlib/Versions                                    |   4 +
 stdlib/stdlib.h                                    |  16 ++-
 stdlib/strfrom-skeleton.c                          | 159 +++++++++++++++++++++
 stdlib/strfromd.c                                  |  23 +++
 stdlib/strfromf.c                                  |  23 +++
 stdlib/strfroml.c                                  |  23 +++
 sysdeps/arm/nacl/libc.abilist                      |   3 +
 sysdeps/unix/sysv/linux/aarch64/libc.abilist       |   3 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist         |   3 +
 sysdeps/unix/sysv/linux/arm/libc.abilist           |   3 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist          |   3 +
 sysdeps/unix/sysv/linux/i386/libc.abilist          |   3 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist          |   3 +
 sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |   3 +
 sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/microblaze/libc.abilist    |   3 +
 .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |   3 +
 .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |   3 +
 .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |   3 +
 .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist         |   3 +
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |   3 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |   3 +
 .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |   3 +
 .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |   3 +
 sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |   3 +
 sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |   3 +
 sysdeps/unix/sysv/linux/sh/libc.abilist            |   3 +
 sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |   3 +
 sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |   3 +
 .../sysv/linux/tile/tilegx/tilegx32/libc.abilist   |   3 +
 .../sysv/linux/tile/tilegx/tilegx64/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist  |   3 +
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |   3 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |   3 +
 38 files changed, 385 insertions(+), 1 deletion(-)
 create mode 100644 stdlib/strfrom-skeleton.c
 create mode 100644 stdlib/strfromd.c
 create mode 100644 stdlib/strfromf.c
 create mode 100644 stdlib/strfroml.c

diff --git a/NEWS b/NEWS
index fdcd7e7..d270875 100644
--- a/NEWS
+++ b/NEWS
@@ -34,6 +34,9 @@ Version 2.25
 
 * The fesetexcept function from TS 18661-1:2014 is added to libm.
 
+* The functions strfromd, strfromf, and strfroml, from ISO/IEC TS 18661-1:2014,
+  are added to libc.  They convert a floating-point number into string.
+
 Security related changes:
 
   On ARM EABI (32-bit), generating a backtrace for execution contexts which
diff --git a/manual/arith.texi b/manual/arith.texi
index 8dcd409..9a49d40 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -20,6 +20,7 @@ These functions are declared in the header files @file{math.h} and
 * Complex Numbers::             The types.  Writing complex constants.
 * Operations on Complex::       Projection, conjugation, decomposition.
 * Parsing of Numbers::          Converting strings to numbers.
+* Printing of Floats::          Converting floating-point numbers to strings.
 * System V Number Conversion::  An archaic way to convert numbers to strings.
 @end menu
 
@@ -2657,6 +2658,46 @@ which take an additional argument, the locale to use in conversion.
 
 See also @ref{Parsing of Integers}.
 
+@node Printing of Floats
+@section Printing of Floats
+
+@pindex stdlib.h
+The @samp{strfrom} functions are declared in @file{stdlib.h}.
+
+@comment stdlib.h
+@comment ISO/IEC TS 18661-1
+@deftypefun int strfromd (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, double @var{value})
+@deftypefunx int strfromf (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, float @var{value})
+@deftypefunx int strfroml (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, long double @var{value})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
+@comment these functions depend on __printf_fp and __printf_fphex, which are
+@comment AS-unsafe (ascuheap) and AC-unsafe (acsmem).
+The functions: @code{strfromd} (``string-from-double''), @code{strfromf}
+(``string-from-float''), and @code{strfroml} (``string-from-long-double'')
+convert the floating-point number in @var{value} to a string of characters
+and stores them into the area pointed to by @var{string}.  The conversion
+writes at most @var{size} characters and respects the format specified by
+@var{format}.
+
+The @var{format} string must start with the character @samp{%}.  An
+optional precision follows, which starts with a period ,@samp{.}, and may
+be followed by a decimal integer, representing the precision.  If a decimal
+integer is not specified after the period, the precision is taken to be
+zero.  The character @samp{*} is not allowed.  Finally, the @var{format}
+string ends with one of the following conversion specifiers: @samp{a},
+@samp{A}, @samp{e}, @samp{E}, @samp{f}, @samp{F}, @samp{g}, @samp{G}.  The
+meaning of each conversion specifier is described at @ref{Table of Output
+Conversions}.
+
+The return of these functions is the number of characters that would have
+been written to @var{string} had @var{size} been sufficiently large, not
+counting the terminating null character.  Thus, the null-terminated output
+has been completely written if and only if the returned value is less than
+@var{size}.
+
+These functions have been introduced by ISO/IEC TS 18661-1.
+@end deftypefun
+
 @node System V Number Conversion
 @section Old-fashioned System V number-to-string functions
 
diff --git a/stdlib/Makefile b/stdlib/Makefile
index fc6f23d..687e40b 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -46,6 +46,7 @@ routines	:=							      \
 	drand48_r erand48_r lrand48_r nrand48_r mrand48_r jrand48_r	      \
 	srand48_r seed48_r lcong48_r					      \
 	drand48-iter							      \
+	strfromf strfromd strfroml					      \
 	strtol strtoul strtoll strtoull					      \
 	strtol_l strtoul_l strtoll_l strtoull_l				      \
 	strtof strtod strtold						      \
@@ -121,6 +122,12 @@ CFLAGS-fmtmsg.c = -fexceptions
 CFLAGS-strfmon.c = $(libio-mtsafe)
 CFLAGS-strfmon_l.c = $(libio-mtsafe)
 
+# The strfrom class of functions call __printf_fp in order to convert the
+# floating-point value to characters.  This requires the value of IO_MTSAFE_IO.
+CFLAGS-strfromd.c = $(libio-mtsafe)
+CFLAGS-strfromf.c = $(libio-mtsafe)
+CFLAGS-strfroml.c = $(libio-mtsafe)
+
 CFLAGS-tst-bsearch.c = $(stack-align-test-flags)
 CFLAGS-tst-qsort.c = $(stack-align-test-flags)
 CFLAGS-tst-makecontext.c += -funwind-tables
diff --git a/stdlib/Versions b/stdlib/Versions
index 9c06b43..54416b7 100644
--- a/stdlib/Versions
+++ b/stdlib/Versions
@@ -112,6 +112,10 @@ libc {
   GLIBC_2.24 {
     quick_exit;
   }
+  GLIBC_2.25 {
+    # s*
+    strfromd; strfromf; strfroml;
+  }
   GLIBC_PRIVATE {
     # functions which have an additional interface since they are
     # are cancelable.
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index f0dc951..3b4c295 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -21,7 +21,8 @@
 
 #ifndef	_STDLIB_H
 
-#include <features.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
 
 /* Get size_t, wchar_t and NULL from <stddef.h>.  */
 #define		__need_size_t
@@ -178,6 +179,19 @@ extern unsigned long long int strtoull (const char *__restrict __nptr,
 __END_NAMESPACE_C99
 #endif /* ISO C99 or use MISC.  */
 
+/* Convert a floating-point number to a string.  */
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+extern int strfromd (char *dest, size_t size, const char *format, double f)
+     __THROW __nonnull ((3));
+
+extern int strfromf (char *dest, size_t size, const char *format, float f)
+     __THROW __nonnull ((3));
+
+extern int strfroml (char *dest, size_t size, const char *format,
+		     long double f)
+     __THROW __nonnull ((3));
+#endif
+
 
 #ifdef __USE_GNU
 /* The concept of one static locale per category is not very well
diff --git a/stdlib/strfrom-skeleton.c b/stdlib/strfrom-skeleton.c
new file mode 100644
index 0000000..37e1b26
--- /dev/null
+++ b/stdlib/strfrom-skeleton.c
@@ -0,0 +1,159 @@
+/* Convert a floating-point number to string.
+
+   Copyright (C) 2016 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/>.  */
+
+/* Generic implementation for strfrom functions.  The implementation is generic
+   for several floating-point types (e.g.: float, double), so that each
+   function, such as strfromf and strfroml, share the same code, thus avoiding
+   code duplication.  */
+
+#define ISDIGIT(Ch)	isdigit (Ch)
+#define TODIGIT(Ch)	((Ch) - '0')
+
+#include <ctype.h>
+#include "../libio/libioP.h"
+#include "../libio/strfile.h"
+#include <printf.h>
+#include <string.h>
+#include <locale/localeinfo.h>
+
+int
+STRFROM (char *dest, size_t size, const char *format, FLOAT f)
+{
+  _IO_strnfile sfile;
+#ifdef _IO_MTSAFE_IO
+  sfile.f._sbf._f._lock = NULL;
+#endif
+
+  int done;
+
+  /* Single-precision values need to be stored in a double type, because
+     __printf_fp_l and __printf_fphex do not accept the float type.  */
+  union {
+    double flt;
+    FLOAT value;
+  } fpnum;
+  const void *fpptr;
+  fpptr = &fpnum;
+
+  /* Variables to control the output format.  Default is [-]x.yyyyyy.  */
+  int precision = -1;
+  int specifier = 'f';
+  struct printf_info info;
+
+  /* Single-precision values need to be converted into double-precision,
+     because __printf_fp and __printf_fphex only accept double and long double
+     as the floating-point argument.  */
+  if (__builtin_types_compatible_p (FLOAT, float))
+    fpnum.flt = f;
+  else
+    fpnum.value = f;
+
+  /* Check if the first character in the format string is indeed the '%'
+     character.  Otherwise, proceed with the default format.  */
+  if (*format == '%')
+    format++;
+  else
+    goto skip_format;
+
+  /* The optional precision specification always starts with a '.'.  If such
+     character is present, read the precision.  */
+  if (*format == '.')
+    {
+      format++;
+
+      /* Parse the precision.  */
+      if (ISDIGIT (*format))
+	{
+	  precision = 0;
+	  while (ISDIGIT (*format))
+	    {
+	      precision *= 10;
+	      precision += TODIGIT (*format);
+	      format++;
+	    }
+	}
+      /* If only the period is specified, the precision is taken as zero, as
+	 described in ISO/IEC 9899:2011, section 7.21.6.1, 4th paragraph, 3rd
+	 item.  */
+      else
+	precision = 0;
+    }
+
+  /* Now there is only the conversion specifier to be read.  */
+  switch (*format)
+    {
+    case 'a':
+    case 'A':
+    case 'e':
+    case 'E':
+    case 'f':
+    case 'F':
+    case 'g':
+    case 'G':
+      specifier = *format;
+      break;
+    default:
+      specifier = 'f';
+      break;
+    }
+
+skip_format:
+
+  /* The following code to prepare the virtual file has been adapted from the
+     function _IO_vsnprintf from libio.  */
+
+  if (size == 0)
+    {
+    /* When size is zero, nothing is written and dest may be a null pointer.
+       This is specified for snprintf in ISO/IEC 9899:2011, Section 7.21.6.5,
+       in the second paragraph.  Thus, if size is zero, prepare to use the
+       overflow buffer right from the start.  */
+      dest = sfile.overflow_buf;
+      size = sizeof (sfile.overflow_buf);
+    }
+
+  /* Prepare the virtual string file.  */
+  _IO_no_init (&sfile.f._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);
+  _IO_JUMPS (&sfile.f._sbf) = &_IO_strn_jumps;
+  _IO_str_init_static_internal (&sfile.f, dest, size - 1, dest);
+
+  /* Prepare the format specification for printf_fp.  */
+  memset (&info, '\0', sizeof (info));
+
+  /* The functions strfromd and strfromf pass a floating-point number with
+     double precision to printf_fp, whereas strfroml passes a floating-point
+     number with long double precision.  The following line informs printf_fp
+     which type of floating-point number is being passed.  */
+  info.is_long_double = __builtin_types_compatible_p (FLOAT, long double);
+
+  /* Set info according to the format string.  */
+  info.prec = precision;
+  info.spec = specifier;
+
+  if (info.spec != 'a' && info.spec != 'A')
+    done = __printf_fp_l (&sfile.f._sbf._f, _NL_CURRENT_LOCALE, &info, &fpptr);
+  else
+    done = __printf_fphex (&sfile.f._sbf._f, &info, &fpptr);
+
+  /* Terminate the string.  */
+  if (sfile.f._sbf._f._IO_buf_base != sfile.overflow_buf)
+    *sfile.f._sbf._f._IO_write_ptr = '\0';
+
+  return done;
+}
diff --git a/stdlib/strfromd.c b/stdlib/strfromd.c
new file mode 100644
index 0000000..ddc010e
--- /dev/null
+++ b/stdlib/strfromd.c
@@ -0,0 +1,23 @@
+/* Definitions for strfromd.  Implementation in stdlib/strfrom-skeleton.c.
+
+   Copyright (C) 2016 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/>.  */
+
+#define FLOAT		double
+#define STRFROM		strfromd
+
+#include "strfrom-skeleton.c"
diff --git a/stdlib/strfromf.c b/stdlib/strfromf.c
new file mode 100644
index 0000000..fa8c107
--- /dev/null
+++ b/stdlib/strfromf.c
@@ -0,0 +1,23 @@
+/* Definitions for strfromf.  Implementation in stdlib/strfrom-skeleton.c.
+
+   Copyright (C) 2016 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/>.  */
+
+#define FLOAT		float
+#define STRFROM		strfromf
+
+#include "strfrom-skeleton.c"
diff --git a/stdlib/strfroml.c b/stdlib/strfroml.c
new file mode 100644
index 0000000..75592a4
--- /dev/null
+++ b/stdlib/strfroml.c
@@ -0,0 +1,23 @@
+/* Definitions for strfroml.  Implementation in stdlib/strfrom-skeleton.c.
+
+   Copyright (C) 2016 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/>.  */
+
+#define FLOAT		long double
+#define STRFROM		strfroml
+
+#include "strfrom-skeleton.c"
diff --git a/sysdeps/arm/nacl/libc.abilist b/sysdeps/arm/nacl/libc.abilist
index 4d3b0b9..807e43d 100644
--- a/sysdeps/arm/nacl/libc.abilist
+++ b/sysdeps/arm/nacl/libc.abilist
@@ -1846,3 +1846,6 @@ GLIBC_2.25 GLIBC_2.25 A
 GLIBC_2.25 gnu_dev_major F
 GLIBC_2.25 gnu_dev_makedev F
 GLIBC_2.25 gnu_dev_minor F
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index 2c2f49e..77accdf 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2090,3 +2090,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 8afba47..659b7fc 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -2001,6 +2001,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist
index de3bdf4..8bc979a 100644
--- a/sysdeps/unix/sysv/linux/arm/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
@@ -91,6 +91,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 3261b93..299b705 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -1855,6 +1855,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index 6465a55..f00345f 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2013,6 +2013,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 4536271..e5fcf88 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -1877,6 +1877,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 287d7a5..8f382f6 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -92,6 +92,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index c9229fa..320b7fe 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -1969,6 +1969,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
index 0409791..21b1426 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
@@ -2090,3 +2090,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index f31653e..5c4b596 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -1944,6 +1944,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index a56bd99..001fa6c 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -1942,6 +1942,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 44552df..2d87001 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -1940,6 +1940,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 8d2a09d..aa1ee66 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -1935,6 +1935,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index 0443b92..2471d68 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2131,3 +2131,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index ba9a29a..4b0cde8 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -1973,6 +1973,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index f19534c..0557c16 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -1978,6 +1978,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
index f8de1ab..821384e 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
@@ -2178,3 +2178,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
index 6819133..c40a3f1 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
@@ -92,6 +92,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 _Exit F
 GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 4cd5d85..5b39a60 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -1973,6 +1973,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 8cdb9df..a9db32f 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -1874,6 +1874,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist
index 69791b4..294af0a 100644
--- a/sysdeps/unix/sysv/linux/sh/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
@@ -1859,6 +1859,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index fce58a8..32747bd 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -1965,6 +1965,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 16ce739..b0ac4d4 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -1903,6 +1903,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
index f99c298..4d92d81 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
@@ -2097,3 +2097,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
index c601ab0..a68aef7 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
@@ -2097,3 +2097,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
index f99c298..4d92d81 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
@@ -2097,3 +2097,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 8e6fa57..b8623fc 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -1854,6 +1854,9 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 1e12f48..a61d874 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2097,3 +2097,6 @@ GLIBC_2.23 fts64_set F
 GLIBC_2.24 GLIBC_2.24 A
 GLIBC_2.24 quick_exit F
 GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 strfromd F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfroml F
-- 
2.4.11

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 0/3] New strfrom functions
@ 2016-08-30 15:08 Gabriel F. T. Gomes
  2016-08-30 15:07 ` [PATCH v2 2/3] Refactor strtod tests Gabriel F. T. Gomes
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Gabriel F. T. Gomes @ 2016-08-30 15:08 UTC (permalink / raw)
  To: libc-alpha

Changes since the previous version:

  - Remove wide-character and locale versions of the functions.  This is done
    in order to keep the API minimal (as it is designed to be) and taking into
    account that it is easy to convert to and from wide strings, as well as it
    is OK to expect users to use uselocale.
  - Remove use of unnecessary internal functions.
  - Remove use of legacy, swprintf-like behavior.
  - Fix headers to use __GLIBC_USE (IEC_60559_BFP_EXT) properly.
  - Fix several GNU coding style errors.
  - Move NEWS text to the end of the block.
  - Group all functions into the same deftypefun in the manual, as well as fix
    typos and errors in the references to the standard.
  - Split the addition of the new test and test refactoring into two patches.

Tested on ppc, ppc64, ppc64le, s390, and x86_64.

Gabriel F. T. Gomes (1):
  Add strfromd, strfromf, and strfroml functions

Rajalakshmi Srinivasaraghavan (2):
  Refactor strtod tests
  Add tests for strfrom functions

 NEWS                                               |   3 +
 manual/arith.texi                                  |  41 ++++++
 stdlib/Makefile                                    |  10 +-
 stdlib/Versions                                    |   4 +
 stdlib/bug-strtod.c                                |   6 +-
 stdlib/bug-strtod2.c                               |   2 +-
 stdlib/stdlib.h                                    |  16 ++-
 stdlib/strfrom-skeleton.c                          | 159 +++++++++++++++++++++
 stdlib/strfromd.c                                  |  23 +++
 stdlib/strfromf.c                                  |  23 +++
 stdlib/strfroml.c                                  |  23 +++
 stdlib/tst-strfrom.c                               | 151 +++++++++++++++++++
 stdlib/tst-strtod-round-skeleton.c                 |  24 ++--
 stdlib/tst-strtod.h                                |   7 +-
 stdlib/tst-strtod6.c                               |   2 +-
 sysdeps/arm/nacl/libc.abilist                      |   3 +
 sysdeps/unix/sysv/linux/aarch64/libc.abilist       |   3 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist         |   3 +
 sysdeps/unix/sysv/linux/arm/libc.abilist           |   3 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist          |   3 +
 sysdeps/unix/sysv/linux/i386/libc.abilist          |   3 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist          |   3 +
 sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |   3 +
 sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/microblaze/libc.abilist    |   3 +
 .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |   3 +
 .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |   3 +
 .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |   3 +
 .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist         |   3 +
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |   3 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |   3 +
 .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |   3 +
 .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |   3 +
 sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |   3 +
 sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |   3 +
 sysdeps/unix/sysv/linux/sh/libc.abilist            |   3 +
 sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |   3 +
 sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |   3 +
 .../sysv/linux/tile/tilegx/tilegx32/libc.abilist   |   3 +
 .../sysv/linux/tile/tilegx/tilegx64/libc.abilist   |   3 +
 sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist  |   3 +
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |   3 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |   3 +
 44 files changed, 557 insertions(+), 24 deletions(-)
 create mode 100644 stdlib/strfrom-skeleton.c
 create mode 100644 stdlib/strfromd.c
 create mode 100644 stdlib/strfromf.c
 create mode 100644 stdlib/strfroml.c
 create mode 100644 stdlib/tst-strfrom.c

-- 
2.4.11

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 3/3] Add tests for strfrom functions
  2016-08-30 15:08 [PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes
  2016-08-30 15:07 ` [PATCH v2 2/3] Refactor strtod tests Gabriel F. T. Gomes
@ 2016-08-30 15:08 ` Gabriel F. T. Gomes
  2016-09-16 23:28   ` Joseph Myers
  2016-09-17  7:07   ` Andreas Schwab
  2016-08-30 15:08 ` [PATCH v2 1/3] Add strfromd, strfromf, and strfroml functions Gabriel F. T. Gomes
  2016-09-16 18:14 ` [PING][PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes
  3 siblings, 2 replies; 8+ messages in thread
From: Gabriel F. T. Gomes @ 2016-08-30 15:08 UTC (permalink / raw)
  To: libc-alpha

From: Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>

2016-08-29  Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>

	* stdlib/Makefile (tests): Add tst-strfrom.
	* stdlib/tst-strfrom.c: New file.
---
 stdlib/Makefile      |   3 +-
 stdlib/tst-strfrom.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 153 insertions(+), 1 deletion(-)
 create mode 100644 stdlib/tst-strfrom.c

diff --git a/stdlib/Makefile b/stdlib/Makefile
index 687e40b..ea1a4bf 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -78,7 +78,7 @@ tests		:= tst-strtol tst-strtod testmb testrand testsort testdiv   \
 		   tst-tininess tst-strtod-underflow tst-tls-atexit	    \
 		   tst-setcontext3 tst-tls-atexit-nodelete		    \
 		   tst-strtol-locale tst-strtod-nan-locale tst-strfmon_l    \
-		   tst-quick_exit tst-thread-quick_exit
+		   tst-quick_exit tst-thread-quick_exit tst-strfrom
 tests-static	:= tst-secure-getenv
 ifeq ($(have-cxx-thread_local),yes)
 CFLAGS-tst-quick_exit.o = -std=c++11
@@ -157,6 +157,7 @@ $(objpfx)tst-strtod5.out: $(gen-locales)
 $(objpfx)tst-strtol-locale.out: $(gen-locales)
 $(objpfx)tst-strtod-nan-locale.out: $(gen-locales)
 $(objpfx)tst-strfmon_l.out: $(gen-locales)
+$(objpfx)tst-strfrom.out: $(gen-locales)
 endif
 
 # Testdir has to be named stdlib and needs to be writable
diff --git a/stdlib/tst-strfrom.c b/stdlib/tst-strfrom.c
new file mode 100644
index 0000000..719dceb
--- /dev/null
+++ b/stdlib/tst-strfrom.c
@@ -0,0 +1,151 @@
+/* Tests for strfromf, strfromd, strfroml functions.
+   Copyright (C) 2016 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+#include <math.h>
+#include <locale.h>
+
+#include "tst-strtod.h"
+
+struct ltest
+{
+  const char *expect;
+  double val;
+  const char *fmt;
+  int size;
+  int rc;
+};
+static const struct ltest ltests[] = {
+  {"12345.3", 12345.345, "%g", 50, 7},
+  {"1.000001", 0x80000Ap-23, "%f", 50, 8},
+  {"inf", HUGE_VAL, "%f", 50, 3},
+  {"-inf", -HUGE_VAL, "%g", 50, 4},
+  {"12.345", 12.345, "%g", 50, 6},
+  {"1.2345e+20", 12.345e19, "%g", 50, 10},
+  {"-1e+08", -.1e+9, "%g", 50, 6},
+  {"0.125000", .125, "%f", 50, 8},
+  {"100000", 1e5, "%g", 50, 6},
+  {"9.999", 9.999, "%.3f", 50, 5},
+  {"0.000000", 0.0, "%f", 50, 8},
+  {"0", 0.0, "%g", 50, 1},
+  {"8.000000", 0x10p-1, "%f", 50, 8},
+  {"8", 0x10p-1, "%g", 50, 1},
+  {"INF", DBL_MAX * DBL_MAX, "%F", 50, 3},
+  {"-INF", -DBL_MAX * DBL_MAX, "%G", 50, 4},
+  {"9.900000", 9.9, "%f", 50, 8},
+  {"9.900", 9.9, "%.3f", 50, 5},
+  {"1", 10.000e-1, "%.f", 50, 1},
+  {"2", 200.000e-2, "%g", 50, 1},
+  {"9.912346", 9.91234567812345678, "%f", 50, 8},
+  {"7.987654e+01", 79.87654321, "%e", 50, 12},
+  {"7.987654E+01", 79.87654321, "%E", 50, 12},
+  {"7.988e+01", 79.87654321, "%.3e", 50, 9},
+  {"7.987654e+01", 79.87654321, "%.6e", 50, 12},
+  {"79.8765", 79.87654321, "%g", 50, 7},
+  {"79.8765", 79.87654321, "%G", 50, 7},
+  {"5.070602e+30", 0x1p102, "%e", 50, 12},
+  {"1.038459e+34", 0x1000p101, "%e", 50, 12},
+  {"2.097152e+06", 0x2p020, "%e", 50, 12},
+  {"1.000000e+38", 1e+38, "%e", 50, 12},
+  {"1.000000e+38", 1e38, "%e", 50, 12},
+  {"1.000000e-37", 1e-37, "%e", 50, 12},
+  {"1.000000e-37", 0.00000001e-29, "%e", 50, 12},
+  {"1.000000e-37", 1.000000e-37, "%e", 50, 12},
+  {"3.761582e-37", 0x1p-121, "%e", 50, 12},
+  {"3.761582e-37", 0x0.0001p-105, "%e", 50, 12},
+  {"5.900000e-16", 5.9e-16, "%e", 50, 12},
+  {"1.000001", 0x80000Ap-23, "%f", 50, 8},
+  {"inf", HUGE_VAL, "%f", 50, 3},
+  {"-INF", -HUGE_VAL, "%G", 50, 4},
+  {"1.2345e+20", 12.345e19, "%g", 50, 10},
+  {"0.125000", .125, "%f", 50, 8},
+  {"100000", 1e5, "%g", 50, 6},
+  {"0x1.8p-11", 0x0.0030p+0, "%a", 50, 9},
+  {"0x1p-10", 0x0.0040p+0, "%a", 50, 7},
+  {"0x1.08p+56", 0x1.08p56, "%a", 50, 10},
+  {"0x1p+61", 0x1p61, "%a", 50, 7},
+  {"0x1.0001p+61", 0x1.0001p61, "%a", 50, 12},
+  {"0x1.4p+3", 10.0, "%a", 50, 8},
+  {"0X1.4P+3", 10.0, "%A", 50, 8},
+  {"nan", NAN, "%e", 50, 3},
+  {"-NAN", -NAN, "%G", 50, 4},
+  {"1.79769e+38", 1.79769e+38, "%g", 50, 11},
+  {"nan", __builtin_nan (""), "%f", 50, 3},
+  {"NAN", __builtin_nans (""), "%G", 50, 3},
+  {"9.1", 9.123456, "%.5f", 4, 7},
+  {NULL, 0, "%f", 50, 0},
+};
+
+#define NTESTS (sizeof (tests) / sizeof (tests[0]))
+
+#define TEST_STRFROM(STRTOF, FTYPE, FTOSTR, LSUF, CSUF)			\
+static int								\
+test_ ## STRTOF (void)							\
+{									\
+  char buf[50];								\
+  const struct ltest *lt;						\
+  int status = 0;							\
+  int rc = 0, rc1 = 0;							\
+  for (lt = ltests; lt->expect != NULL; ++lt)				\
+    {									\
+      rc = FTOSTR (buf, lt->size, lt->fmt, lt->val);			\
+      if (strcmp (lt->fmt, "%a") == 0 || strcmp (lt->fmt, "%A") == 0)	\
+	rc1 = (strtold (lt->expect, NULL) == strtold (buf, NULL))	\
+	      ? 0 : 1;							\
+      else								\
+	rc1 = (strcmp (buf, lt->expect) != 0) || (rc != lt->rc);	\
+      if (rc1)								\
+	{								\
+	  printf (#FTOSTR ": got %s (%d), expected %s (%d)\n",		\
+		  buf, rc, lt->expect, lt->rc);				\
+	  status++;							\
+	}								\
+    }									\
+  return status;							\
+}
+
+GEN_TEST_STRTOD_FOREACH (TEST_STRFROM)
+
+static int
+test_locale (const char *locale)
+{
+  printf ("Testing in locale: %s\n", locale);
+  if (setlocale (LC_CTYPE, locale) == NULL)
+    {
+      printf ("Cannot set locale %s\n", locale);
+    }
+  return STRTOD_TEST_FOREACH (test_);
+}
+static int
+do_test (void)
+{
+  int result = 0;
+  result += test_locale ("C");
+  result += test_locale ("de_DE.UTF-8");
+  result += test_locale ("en_US.ISO-8859-1");
+  result += test_locale ("en_US.UTF-8");
+  result += test_locale ("tr_TR.ISO-8859-9");
+  result += test_locale ("tr_TR.UTF-8");
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
-- 
2.4.11

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PING][PATCH v2 0/3] New strfrom functions
  2016-08-30 15:08 [PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes
                   ` (2 preceding siblings ...)
  2016-08-30 15:08 ` [PATCH v2 1/3] Add strfromd, strfromf, and strfroml functions Gabriel F. T. Gomes
@ 2016-09-16 18:14 ` Gabriel F. T. Gomes
  3 siblings, 0 replies; 8+ messages in thread
From: Gabriel F. T. Gomes @ 2016-09-16 18:14 UTC (permalink / raw)
  To: libc-alpha

Ping.

On Tue, 30 Aug 2016 12:07:41 -0300
"Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com> wrote:

> Changes since the previous version:
> 
>   - Remove wide-character and locale versions of the functions.  This is done
>     in order to keep the API minimal (as it is designed to be) and taking into
>     account that it is easy to convert to and from wide strings, as well as it
>     is OK to expect users to use uselocale.
>   - Remove use of unnecessary internal functions.
>   - Remove use of legacy, swprintf-like behavior.
>   - Fix headers to use __GLIBC_USE (IEC_60559_BFP_EXT) properly.
>   - Fix several GNU coding style errors.
>   - Move NEWS text to the end of the block.
>   - Group all functions into the same deftypefun in the manual, as well as fix
>     typos and errors in the references to the standard.
>   - Split the addition of the new test and test refactoring into two patches.
> 
> Tested on ppc, ppc64, ppc64le, s390, and x86_64.
> 
> Gabriel F. T. Gomes (1):
>   Add strfromd, strfromf, and strfroml functions
> 
> Rajalakshmi Srinivasaraghavan (2):
>   Refactor strtod tests
>   Add tests for strfrom functions
> 
>  NEWS                                               |   3 +
>  manual/arith.texi                                  |  41 ++++++
>  stdlib/Makefile                                    |  10 +-
>  stdlib/Versions                                    |   4 +
>  stdlib/bug-strtod.c                                |   6 +-
>  stdlib/bug-strtod2.c                               |   2 +-
>  stdlib/stdlib.h                                    |  16 ++-
>  stdlib/strfrom-skeleton.c                          | 159 +++++++++++++++++++++
>  stdlib/strfromd.c                                  |  23 +++
>  stdlib/strfromf.c                                  |  23 +++
>  stdlib/strfroml.c                                  |  23 +++
>  stdlib/tst-strfrom.c                               | 151 +++++++++++++++++++
>  stdlib/tst-strtod-round-skeleton.c                 |  24 ++--
>  stdlib/tst-strtod.h                                |   7 +-
>  stdlib/tst-strtod6.c                               |   2 +-
>  sysdeps/arm/nacl/libc.abilist                      |   3 +
>  sysdeps/unix/sysv/linux/aarch64/libc.abilist       |   3 +
>  sysdeps/unix/sysv/linux/alpha/libc.abilist         |   3 +
>  sysdeps/unix/sysv/linux/arm/libc.abilist           |   3 +
>  sysdeps/unix/sysv/linux/hppa/libc.abilist          |   3 +
>  sysdeps/unix/sysv/linux/i386/libc.abilist          |   3 +
>  sysdeps/unix/sysv/linux/ia64/libc.abilist          |   3 +
>  sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |   3 +
>  sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |   3 +
>  sysdeps/unix/sysv/linux/microblaze/libc.abilist    |   3 +
>  .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |   3 +
>  .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |   3 +
>  .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |   3 +
>  .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |   3 +
>  sysdeps/unix/sysv/linux/nios2/libc.abilist         |   3 +
>  .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |   3 +
>  .../linux/powerpc/powerpc32/nofpu/libc.abilist     |   3 +
>  .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |   3 +
>  .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |   3 +
>  sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |   3 +
>  sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |   3 +
>  sysdeps/unix/sysv/linux/sh/libc.abilist            |   3 +
>  sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |   3 +
>  sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |   3 +
>  .../sysv/linux/tile/tilegx/tilegx32/libc.abilist   |   3 +
>  .../sysv/linux/tile/tilegx/tilegx64/libc.abilist   |   3 +
>  sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist  |   3 +
>  sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |   3 +
>  sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |   3 +
>  44 files changed, 557 insertions(+), 24 deletions(-)
>  create mode 100644 stdlib/strfrom-skeleton.c
>  create mode 100644 stdlib/strfromd.c
>  create mode 100644 stdlib/strfromf.c
>  create mode 100644 stdlib/strfroml.c
>  create mode 100644 stdlib/tst-strfrom.c
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/3] Add strfromd, strfromf, and strfroml functions
  2016-08-30 15:08 ` [PATCH v2 1/3] Add strfromd, strfromf, and strfroml functions Gabriel F. T. Gomes
@ 2016-09-16 23:23   ` Joseph Myers
  0 siblings, 0 replies; 8+ messages in thread
From: Joseph Myers @ 2016-09-16 23:23 UTC (permalink / raw)
  To: Gabriel F. T. Gomes; +Cc: libc-alpha

On Tue, 30 Aug 2016, Gabriel F. T. Gomes wrote:

> +/* Convert a floating-point number to a string.  */
> +#if __GLIBC_USE (IEC_60559_BFP_EXT)
> +extern int strfromd (char *dest, size_t size, const char *format, double f)
> +     __THROW __nonnull ((3));
> +
> +extern int strfromf (char *dest, size_t size, const char *format, float f)
> +     __THROW __nonnull ((3));
> +
> +extern int strfroml (char *dest, size_t size, const char *format,
> +		     long double f)
> +     __THROW __nonnull ((3));
> +#endif

You need a leading __ on the parameter names in headers; what you have 
here violates namespace rules.

> +      /* Parse the precision.  */
> +      if (ISDIGIT (*format))
> +	{
> +	  precision = 0;
> +	  while (ISDIGIT (*format))
> +	    {
> +	      precision *= 10;
> +	      precision += TODIGIT (*format);
> +	      format++;

I'd still expect you to use read_int from printf-parse.h (which avoids 
undefined behavior on overflow).

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 3/3] Add tests for strfrom functions
  2016-08-30 15:08 ` [PATCH v2 3/3] Add tests for strfrom functions Gabriel F. T. Gomes
@ 2016-09-16 23:28   ` Joseph Myers
  2016-09-17  7:07   ` Andreas Schwab
  1 sibling, 0 replies; 8+ messages in thread
From: Joseph Myers @ 2016-09-16 23:28 UTC (permalink / raw)
  To: Gabriel F. T. Gomes; +Cc: libc-alpha

On Tue, 30 Aug 2016, Gabriel F. T. Gomes wrote:

> +static const struct ltest ltests[] = {
> +  {"12345.3", 12345.345, "%g", 50, 7},
> +  {"1.000001", 0x80000Ap-23, "%f", 50, 8},

I'm not sure where this set of test inputs comes from.  But I'd expect you 
to have test values of the relevant type, not double.

> +      rc = FTOSTR (buf, lt->size, lt->fmt, lt->val);			\
> +      if (strcmp (lt->fmt, "%a") == 0 || strcmp (lt->fmt, "%A") == 0)	\
> +	rc1 = (strtold (lt->expect, NULL) == strtold (buf, NULL))	\
> +	      ? 0 : 1;							\

And I'm not convinced by the use of strtold here.  There are limited 
number of possible valid hex strings for given floating-point input; you 
could just make the tests list them all.

I don't see test coverage of the results when the buffer is too small.  
Or of LC_NUMERIC changes (meaning different decimal points, if it does 
have that effect).

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 3/3] Add tests for strfrom functions
  2016-08-30 15:08 ` [PATCH v2 3/3] Add tests for strfrom functions Gabriel F. T. Gomes
  2016-09-16 23:28   ` Joseph Myers
@ 2016-09-17  7:07   ` Andreas Schwab
  1 sibling, 0 replies; 8+ messages in thread
From: Andreas Schwab @ 2016-09-17  7:07 UTC (permalink / raw)
  To: Gabriel F. T. Gomes; +Cc: libc-alpha

On Aug 30 2016, "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com> wrote:

> +  int rc = 0, rc1 = 0;							\
bool rc1

> +  for (lt = ltests; lt->expect != NULL; ++lt)				\
> +    {									\
> +      rc = FTOSTR (buf, lt->size, lt->fmt, lt->val);			\
> +      if (strcmp (lt->fmt, "%a") == 0 || strcmp (lt->fmt, "%A") == 0)	\
> +	rc1 = (strtold (lt->expect, NULL) == strtold (buf, NULL))	\
> +	      ? 0 : 1;							\

rc1 = strtold (lt->expect, NULL) != strtold (buf, NULL)

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-09-17  7:07 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-30 15:08 [PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes
2016-08-30 15:07 ` [PATCH v2 2/3] Refactor strtod tests Gabriel F. T. Gomes
2016-08-30 15:08 ` [PATCH v2 3/3] Add tests for strfrom functions Gabriel F. T. Gomes
2016-09-16 23:28   ` Joseph Myers
2016-09-17  7:07   ` Andreas Schwab
2016-08-30 15:08 ` [PATCH v2 1/3] Add strfromd, strfromf, and strfroml functions Gabriel F. T. Gomes
2016-09-16 23:23   ` Joseph Myers
2016-09-16 18:14 ` [PING][PATCH v2 0/3] New strfrom functions Gabriel F. T. Gomes

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).