This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 1/2] Add strfrom{d,f,l} and wcsfrom{d,f,l} functions


ISO/IEC TS 18661-1 adds several functions in the strfrom family to stdlib.
This patch adds strfromd, strfromf, and strfroml, as well as their wide
character counterparts (wcsfromd, wcsfromf, and wcsfroml).  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, wcsfromd,
	wcsfromf, and wcsfroml.
	* include/stdlib.h (__strfromd_l): New hidden declaration.
	(__strfromf_l): Likewise.
	(__strfroml_l): Likewise.
	(__strfromd_internal): Likewise.
	(__strfromf_internal): Likewise.
	(__strfroml_internal): Likewise.
	* include/wchar.h (____wcsfromd_l_internal): New hidden declaration.
	(____wcsfromf_l_internal): Likewise.
	(____wcsfroml_l_internal): Likewise.
	(__wcsfromd_internal): Likewise.
	(__wcsfromf_internal): Likewise.
	(__wcsfroml_internal): Likewise.
	(wcsfromd): Set to hidden.
	(wcsfromf): Likewise.
	(wcsfroml): Likewise.
	* locale/Versions (GLIBC_2.25): Add entries for strfromd_l, strfromf_l,
	strfroml_l, wcsfromd_l, wcsfromf_, and wcsfroml_l.
	* stdlib/Makefile: Add strfromd, strfromf, strfroml, strfromd_l,
	strfromf_l, and strfroml_l build rules and flags.
	* stdlib/Versions (GLIBC_2.25): Add entries for strfromd, strfromf,
	and strfroml.
	* stdlib/stdlib.h (strfromd): New declaration.
	(strfromf): Likewise.
	(strfroml): Likewise.
	(strfromd_l): Likewise.
	(strfromf_l): Likewise.
	(strfroml_l): Likewise.
	* stdlib/strfrom-skeleton.c: New file.  Generic implementation for
	strfrom.
	* stdlib/strfrom_l-skeleton.c: Likewise.
	* stdlib/strfromd.c: New file.
	* stdlib/strfromf.c: Likewise.
	* stdlib/strfroml.c: Likewise.
	* stdlib/strfromd_l.c: Likewise.
	* stdlib/strfromf_l.c: Likewise.
	* stdlib/strfroml_l.c: Likewise.
	* stdlib/strfrom_defaults.h: 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.
	* wcsmbs/Makefile: Add wcsfromd, wcsfromf, wcsfroml, wcsfromd_l,
	wcsfromf_l, and wcsfroml_l build rules and flags.
	* wcsmbs/Versions (GLIBC_2.25): Add entries for wcsfromd, wcsfromf,
	and wcsfroml.
	* wcsmbs/wchar.h (wcsfromd): New declaration.
	(wcsfromf): Likewise.
	(wcsfroml): Likewise.
	(wcsfromd_l): Likewise.
	(wcsfromf_l): Likewise.
	(wcsfroml_l): Likewise.
	* wcsmbs/wcsfromd.c: New file.
	* wcsmbs/wcsfromd_l.c: Likewise.
	* wcsmbs/wcsfromf.c: Likewise.
	* wcsmbs/wcsfromf_l.c: Likewise.
	* wcsmbs/wcsfroml.c: Likewise.
	* wcsmbs/wcsfroml_l.c: Likewise.
---
 NEWS                                               |   4 +
 include/stdlib.h                                   |  41 ++++
 include/wchar.h                                    |  41 ++++
 locale/Versions                                    |   4 +
 manual/arith.texi                                  |  72 ++++++
 stdlib/Makefile                                    |  11 +
 stdlib/Versions                                    |   4 +
 stdlib/stdlib.h                                    |  33 +++
 stdlib/strfrom-skeleton.c                          |  60 +++++
 stdlib/strfrom_l-skeleton.c                        | 248 +++++++++++++++++++++
 stdlib/strfromd.c                                  |  29 +++
 stdlib/strfromd_l.c                                |  29 +++
 stdlib/strfromf.c                                  |  29 +++
 stdlib/strfromf_l.c                                |  29 +++
 stdlib/strfroml.c                                  |  29 +++
 stdlib/strfroml_l.c                                |  29 +++
 sysdeps/arm/nacl/libc.abilist                      |  12 +
 sysdeps/unix/sysv/linux/aarch64/libc.abilist       |  12 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist         |  12 +
 sysdeps/unix/sysv/linux/arm/libc.abilist           |  12 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist          |  12 +
 sysdeps/unix/sysv/linux/i386/libc.abilist          |  12 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist          |  12 +
 sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |  12 +
 sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |  12 +
 sysdeps/unix/sysv/linux/microblaze/libc.abilist    |  12 +
 .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |  12 +
 .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |  12 +
 .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |  12 +
 .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |  12 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist         |  12 +
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |  12 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |  12 +
 .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |  12 +
 .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |  12 +
 sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |  12 +
 sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |  12 +
 sysdeps/unix/sysv/linux/sh/libc.abilist            |  12 +
 sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |  12 +
 sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |  12 +
 .../sysv/linux/tile/tilegx/tilegx32/libc.abilist   |  12 +
 .../sysv/linux/tile/tilegx/tilegx64/libc.abilist   |  12 +
 sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist  |  12 +
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |  12 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |  12 +
 wcsmbs/Makefile                                    |  11 +
 wcsmbs/Versions                                    |   3 +
 wcsmbs/wchar.h                                     |  23 ++
 wcsmbs/wcsfromd.c                                  |  25 +++
 wcsmbs/wcsfromd_l.c                                |  25 +++
 wcsmbs/wcsfromf.c                                  |  25 +++
 wcsmbs/wcsfromf_l.c                                |  25 +++
 wcsmbs/wcsfroml.c                                  |  25 +++
 wcsmbs/wcsfroml_l.c                                |  25 +++
 54 files changed, 1227 insertions(+)
 create mode 100644 stdlib/strfrom-skeleton.c
 create mode 100644 stdlib/strfrom_l-skeleton.c
 create mode 100644 stdlib/strfromd.c
 create mode 100644 stdlib/strfromd_l.c
 create mode 100644 stdlib/strfromf.c
 create mode 100644 stdlib/strfromf_l.c
 create mode 100644 stdlib/strfroml.c
 create mode 100644 stdlib/strfroml_l.c
 create mode 100644 wcsmbs/wcsfromd.c
 create mode 100644 wcsmbs/wcsfromd_l.c
 create mode 100644 wcsmbs/wcsfromf.c
 create mode 100644 wcsmbs/wcsfromf_l.c
 create mode 100644 wcsmbs/wcsfroml.c
 create mode 100644 wcsmbs/wcsfroml_l.c

diff --git a/NEWS b/NEWS
index fdcd7e7..bf5a307 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,10 @@ using `glibc' in the "product" field.
 
 Version 2.25
 
+* The functions strfromd, strfromf, and strfroml, as well as their
+  wide-character counterparts are present in libc.  These functions are defined
+  in ISO/IEC TS 18661-1:2014 and convert a floating-point number into string.
+
 * The feature test macro __STDC_WANT_LIB_EXT2__, from ISO/IEC TR
   24731-2:2010, is supported to enable declarations of functions from that
   TR.  Note that not all functions from that TR are supported by the GNU C
diff --git a/include/stdlib.h b/include/stdlib.h
index 352339e..973a5da 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -30,6 +30,13 @@ libc_hidden_proto (__strtod_l)
 libc_hidden_proto (__strtof_l)
 libc_hidden_proto (__strtold_l)
 
+extern __typeof (strfromd_l) __strfromd_l;
+extern __typeof (strfromf_l) __strfromf_l;
+extern __typeof (strfroml_l) __strfroml_l;
+libc_hidden_proto (__strfromd_l);
+libc_hidden_proto (__strfromf_l);
+libc_hidden_proto (__strfroml_l);
+
 libc_hidden_proto (exit)
 libc_hidden_proto (abort)
 libc_hidden_proto (getenv)
@@ -203,6 +210,40 @@ libc_hidden_proto (strtoll)
 libc_hidden_proto (strtoul)
 libc_hidden_proto (strtoull)
 
+
+extern int __strfromf_internal (char * __dest, size_t __size,
+				const char * __format, float __f, int __group)
+     __THROW __nonnull ((3));
+extern int __strfromd_internal (char * __dest, size_t __size,
+				const char * __format, double __f, int __group)
+     __THROW __nonnull ((3));
+extern int __strfroml_internal (char * __dest, size_t __size,
+				const char * __format, long double __f,
+				int __group)
+     __THROW __nonnull ((3));
+
+libc_hidden_proto (__strfromf_internal)
+libc_hidden_proto (__strfromd_internal)
+libc_hidden_proto (__strfroml_internal)
+
+extern int ____strfromf_l_internal (char * __dest, size_t __size,
+				    const char * __format, float __f,
+				    int __group, __locale_t __loc);
+extern int ____strfromd_l_internal (char * __dest, size_t __size,
+				    const char * __format, double __f,
+				    int __group, __locale_t __loc);
+extern int ____strfroml_l_internal (char * __dest, size_t __size,
+				    const char * __format, long double __f,
+				    int __group, __locale_t __loc);
+
+libc_hidden_proto (____strfromf_l_internal)
+libc_hidden_proto (____strfromd_l_internal)
+libc_hidden_proto (____strfroml_l_internal)
+
+libc_hidden_proto (strfromf)
+libc_hidden_proto (strfromd)
+libc_hidden_proto (strfroml)
+
 extern float __strtof_nan (const char *, char **, char) internal_function;
 extern double __strtod_nan (const char *, char **, char) internal_function;
 extern long double __strtold_nan (const char *, char **, char)
diff --git a/include/wchar.h b/include/wchar.h
index 6272130..b700f1a 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -70,6 +70,46 @@ libc_hidden_proto (wcstoll)
 libc_hidden_proto (wcstoul)
 libc_hidden_proto (wcstoull)
 
+extern __typeof (wcsfromd_l) __wcsfromd_l;
+extern __typeof (wcsfromf_l) __wcsfromf_l;
+extern __typeof (wcsfroml_l) __wcsfroml_l;
+libc_hidden_proto (__wcsfromd_l)
+libc_hidden_proto (__wcsfromf_l)
+libc_hidden_proto (__wcsfroml_l)
+
+extern int __wcsfromf_internal (wchar_t *__restrict __dest, size_t __size,
+				const char * __format, float __f, int __group)
+     __THROW;
+extern int __wcsfromd_internal (wchar_t *__restrict __dest, size_t __size,
+				const char * __format, double __f, int __group)
+     __THROW;
+extern int __wcsfroml_internal (wchar_t *__restrict __dest, size_t __size,
+				const char * __format, long double __f,
+				int __group)
+     __THROW;
+
+libc_hidden_proto (__wcsfromf_internal)
+libc_hidden_proto (__wcsfromd_internal)
+libc_hidden_proto (__wcsfroml_internal)
+
+extern int ____wcsfromf_l_internal (wchar_t * __dest, size_t __size,
+				    const char * __format, float __f,
+				    int __group, __locale_t __loc);
+extern int ____wcsfromd_l_internal (wchar_t * __dest, size_t __size,
+				    const char * __format, double __f,
+				    int __group, __locale_t __loc);
+extern int ____wcsfroml_l_internal (wchar_t * __dest, size_t __size,
+				    const char * __format, long double __f,
+				    int __group, __locale_t __loc);
+
+libc_hidden_proto (____wcsfromf_l_internal)
+libc_hidden_proto (____wcsfromd_l_internal)
+libc_hidden_proto (____wcsfroml_l_internal)
+
+libc_hidden_proto (wcsfromf)
+libc_hidden_proto (wcsfromd)
+libc_hidden_proto (wcsfroml)
+
 libc_hidden_proto (__wcscasecmp_l)
 libc_hidden_proto (__wcsncasecmp_l)
 
@@ -172,6 +212,7 @@ extern int __vfwprintf (__FILE *__restrict __s,
 			const wchar_t *__restrict __format,
 			__gnuc_va_list __arg)
      /* __attribute__ ((__format__ (__wprintf__, 2, 0))) */;
+extern int __swprintf (wchar_t *s, size_t n, const wchar_t *format, ...);
 #ifndef __cplusplus
 extern int __vfwprintf_chk (FILE *__restrict __s, int __flag,
 			    const wchar_t *__restrict __format,
diff --git a/locale/Versions b/locale/Versions
index 7211934..42b7df4 100644
--- a/locale/Versions
+++ b/locale/Versions
@@ -66,6 +66,10 @@ libc {
     wcstoll_l; wcstoul_l; wcstoull_l; wcsxfrm_l; wctype_l;
     wctrans_l; nl_langinfo_l;
   }
+  GLIBC_2.25 {
+    strfromd_l; strfromf_l; strfroml_l;
+    wcsfromd_l; wcsfromf_l; wcsfroml_l;
+  }
   GLIBC_PRIVATE {
     # global variables
     __collate_element_hash; __collate_element_strings;
diff --git a/manual/arith.texi b/manual/arith.texi
index 8dcd409..39c5e44 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
 
@@ -2652,6 +2653,77 @@ is provided mostly for compatibility with existing code; using
 @code{strtod} is more robust.
 @end deftypefun
 
+@node Printing of Floats
+@section Printing of Floats
+
+@pindex stdlib.h
+@pindex wchar.h
+The @samp{str} functions are declared in @file{stdlib.h} and those
+beginning with @samp{wcs} are declared in @file{wchar.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})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
+@comment strfromd depends on __printf_fp and __printf_fphex, which are
+@comment AS-unsafe (ascuheap) and AC-unsafe (acsmem).
+The @code{strfromd} (``string-from-double'') function converts 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 this function 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}.
+@end deftypefun
+
+@comment stdlib.h
+@comment ISO/IEC TS 18661-1
+@deftypefun int strfromf (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, float @var{value})
+@comment stdlib.h
+@comment ISO/IEC TS 18661-1
+@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{}}}
+These functions are analogous to @code{strfromd}, but accept @code{float},
+and @code{long double}, respectively, as the last argument.
+
+These functions have been introduced by ISO/IEC TS 18661-1.
+
+@comment wchar.h
+@comment ISO/IEC TS 18661-1
+@deftypefun int wcsfromd (wchar_t *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, double @var{value})
+@comment wchar.h
+@comment ISO/IEC TS 18661-1
+@deftypefun int wcsfromf (wchar_t *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, float @var{value})
+@comment wchar.h
+@comment ISO/IEC TS 18661-1
+@deftypefun int wcsfroml (wchar_t *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, long double @var{value})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
+These functions are analogous to @code{strfromd}, @code{strfromf}, and
+@code{strfroml}, respectively, but print to wide character strings
+(@code{wchar_t *}), instead of to regular character strings (@code{char *}).
+
+These functions return the number of characters that have been written to
+@var{string} if @var{size} was large enough and no encoding errors have
+occurred.  Otherwise, they return a negative number.
+
+These functions are GNU extensions.
+
+@end deftypefun
+
 @Theglibc{} also provides @samp{_l} versions of these functions,
 which take an additional argument, the locale to use in conversion.
 
diff --git a/stdlib/Makefile b/stdlib/Makefile
index fc6f23d..67969aa 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -46,6 +46,8 @@ routines	:=							      \
 	drand48_r erand48_r lrand48_r nrand48_r mrand48_r jrand48_r	      \
 	srand48_r seed48_r lcong48_r					      \
 	drand48-iter							      \
+	strfromf strfromd strfroml					      \
+	strfromf_l strfromd_l strfroml_l				      \
 	strtol strtoul strtoll strtoull					      \
 	strtol_l strtoul_l strtoll_l strtoull_l				      \
 	strtof strtod strtold						      \
@@ -121,6 +123,15 @@ 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-strfromd_l.c = $(libio-mtsafe)
+CFLAGS-strfromf.c = $(libio-mtsafe)
+CFLAGS-strfromf_l.c = $(libio-mtsafe)
+CFLAGS-strfroml.c = $(libio-mtsafe)
+CFLAGS-strfroml_l.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..399e3b2 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -21,6 +21,9 @@
 
 #ifndef	_STDLIB_H
 
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
+
 #include <features.h>
 
 /* Get size_t, wchar_t and NULL from <stddef.h>.  */
@@ -125,6 +128,12 @@ __BEGIN_NAMESPACE_STD
 extern double strtod (const char *__restrict __nptr,
 		      char **__restrict __endptr)
      __THROW __nonnull ((1));
+/* 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));
+#endif
 __END_NAMESPACE_STD
 
 #ifdef	__USE_ISOC99
@@ -136,6 +145,16 @@ extern float strtof (const char *__restrict __nptr,
 extern long double strtold (const char *__restrict __nptr,
 			    char **__restrict __endptr)
      __THROW __nonnull ((1));
+
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+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
 __END_NAMESPACE_C99
 #endif
 
@@ -230,6 +249,20 @@ extern long double strtold_l (const char *__restrict __nptr,
 			      char **__restrict __endptr,
 			      __locale_t __loc)
      __THROW __nonnull ((1, 3));
+
+# if __GLIBC_USE (IEC_60559_BFP_EXT)
+extern int strfromd_l (char * __dest, size_t __size, const char * __format,
+		       double __f, __locale_t __loc)
+     __THROW __nonnull ((3));
+
+extern int strfromf_l (char * __dest, size_t __size, const char * __format,
+		       float __f, __locale_t __loc)
+     __THROW __nonnull ((3));
+
+extern int strfroml_l (char * __dest, size_t __size, const char * __format,
+		       long double __f, __locale_t __loc)
+     __THROW __nonnull ((3));
+# endif
 #endif /* GNU */
 
 
diff --git a/stdlib/strfrom-skeleton.c b/stdlib/strfrom-skeleton.c
new file mode 100644
index 0000000..c3c8a4d
--- /dev/null
+++ b/stdlib/strfrom-skeleton.c
@@ -0,0 +1,60 @@
+/* Generic implementation for strfrom functions.
+
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+   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 <stdlib.h>
+#include <wchar.h>
+#include <locale/localeinfo.h>
+
+#ifdef USE_WIDE_CHAR
+# include <wctype.h>
+# define STRING_TYPE wchar_t
+#else
+# define STRING_TYPE char
+#endif
+
+#define INTERNAL(x) INTERNAL1(x)
+#define INTERNAL1(x) __##x##_internal
+
+
+/* Prototype for the internal implementation.  */
+#include <xlocale.h>
+extern int INTERNAL (STRFROMF_L) (
+	STRING_TYPE *, size_t, const char *, FLOAT, int, __locale_t);
+
+int
+INTERNAL (STRFROMF) (STRING_TYPE *dest, size_t size, const char * format,
+		     FLOAT f, int group)
+{
+  return INTERNAL(STRFROMF_L) (dest, size, format, f, group, _NL_CURRENT_LOCALE);
+}
+#if defined _LIBC
+libc_hidden_def (INTERNAL (STRFROMF))
+#endif
+
+
+int
+#ifdef weak_function
+weak_function
+#endif
+STRFROMF (STRING_TYPE *dest, size_t size, const char * format, FLOAT f)
+{
+  return INTERNAL(STRFROMF_L) (dest, size, format, f, 0, _NL_CURRENT_LOCALE);
+}
+#if defined _LIBC
+libc_hidden_def (STRFROMF)
+#endif
diff --git a/stdlib/strfrom_l-skeleton.c b/stdlib/strfrom_l-skeleton.c
new file mode 100644
index 0000000..8fb55d5
--- /dev/null
+++ b/stdlib/strfrom_l-skeleton.c
@@ -0,0 +1,248 @@
+/* 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), and for char type
+   (i.e.: char or wchar_t), so that each function, such as strfromf and
+   wcsfroml, share the same code, thus avoiding code duplication.  */
+
+#if defined _LIBC || defined HAVE_WCHAR_H
+# include <wchar.h>
+#endif
+
+#ifdef USE_WIDE_CHAR
+# include <wctype.h>
+# define STRING_TYPE wchar_t
+#else
+# define STRING_TYPE char
+#endif
+
+#define INTERNAL(x) INTERNAL1(x)
+#define INTERNAL1(x) __##x##_internal
+#ifndef ____STRFROMF_INTERNAL
+# define ____STRFROMF_INTERNAL INTERNAL (__STRFROMF)
+#endif
+
+#include <ctype.h>
+#include "../libio/libioP.h"
+#include "../libio/strfile.h"
+#include <stdio.h>
+#include <printf.h>
+#include <string.h>
+
+
+#define to_digit(Ch) ((Ch) - '0')
+
+int
+____STRFROMF_INTERNAL (STRING_TYPE *dest, size_t size, const char * format,
+		       FLOAT f, int group, __locale_t loc)
+{
+#ifdef USE_WIDE_CHAR
+  _IO_wstrnfile sfile;
+  struct _IO_wide_data wd;
+#else
+  _IO_strnfile sfile;
+#endif
+
+#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 format 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 format string is not null, even though TS-18661-1 does not
+     mention that the format string cannot be null.  */
+  if (format == NULL)
+    {
+      MAYBE_SET_EINVAL;
+      return -1;
+    }
+  /* 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++;
+
+      /* According to ISO/IEC 9899:201x, Section 7.21.6.1, 5th paragraph, a
+	 negative precision is taken as if the precision were omitted.  Thus,
+	 parse a potential minus sign.  If the minus sign is present, ignore
+	 the following precision digits.  */
+      if (*format == '-')
+	{
+	  format++;
+	  while (isdigit (*format))
+	    format++;
+	}
+      /* Otherwise, parse the precision.  */
+      else if (isdigit (*format))
+	{
+	  precision = 0;
+	  while (isdigit (*format))
+	    {
+	      precision *= 10;
+	      precision += to_digit(*format);
+	      format++;
+	    }
+	}
+      /* If only the period is specified, the precision is taken as zero, as
+	 described in ISO/IEC 9899:201x, 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
+     functions _IO_vsnprintf and _IO_vswprintf from libio.  */
+
+  if (size == 0)
+    {
+#ifdef USE_WIDE_CHAR
+    /* ISO/IEC 9899:201x, Section 7.29.2.3, in the third paragraph, specifies
+       that swprintf returns a negative value if n or more characters would
+       have been written.  Thus, if size (n) is zero, return a negative number,
+       so that wcsfrom functions behave similar to swprintf.  */
+      return -1;
+#else
+    /* When size is zero, nothing is written and dest may be a null pointer.
+       This is specified for snprintf in ISO/IEC 9899:201x, 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);
+#endif
+    }
+
+  /* Prepare the virtual string file.  */
+#ifdef USE_WIDE_CHAR
+  _IO_no_init (&sfile.f._sbf._f, _IO_USER_LOCK, 0, &wd, &_IO_wstrn_jumps);
+  _IO_fwide (&sfile.f._sbf._f, 1);
+  _IO_wstr_init_static (&sfile.f._sbf._f, dest, size - 1, dest);
+#else
+  _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);
+#endif
+
+  /* Prepare the format specification for printf_fp.  */
+  memset (&info, '\0', sizeof (info));
+
+  /* Grouping has been received as a parameter.  */
+  info.group = group;
+
+  /* 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;
+  info.wide = sizeof (STRING_TYPE) != 1;
+
+  if (info.spec != 'a' && info.spec != 'A')
+      done = __printf_fp_l (&sfile.f._sbf._f, loc, &info, &fpptr);
+  else
+      done = __printf_fphex (&sfile.f._sbf._f, &info, &fpptr);
+
+  /* Terminate the string.  */
+#ifdef USE_WIDE_CHAR
+  if (sfile.f._sbf._f._wide_data->_IO_buf_base == sfile.overflow_buf)
+    /* ISO C99 requires swprintf to return an error if the output does not fit
+       in the provided buffer.  The wcsfrom functions mimic this behavior.  */
+    return -1;
+  *sfile.f._sbf._f._wide_data->_IO_write_ptr = L'\0';
+#else
+  if (sfile.f._sbf._f._IO_buf_base != sfile.overflow_buf)
+    *sfile.f._sbf._f._IO_write_ptr = '\0';
+#endif
+
+  return done;
+}
+#if defined _LIBC && !defined USE_WIDE_CHAR
+libc_hidden_def (____STRFROMF_INTERNAL)
+#endif
+
+/* External user entry point.  */
+
+int
+#ifdef weak_function
+weak_function
+#endif
+__STRFROMF (STRING_TYPE * dest, size_t size, const char * format, FLOAT f,
+	    __locale_t loc)
+{
+  return ____STRFROMF_INTERNAL (dest, size, format, f, 0, loc);
+}
+#if defined _LIBC
+libc_hidden_def (__STRFROMF)
+libc_hidden_ver (__STRFROMF, STRFROMF)
+#endif
+weak_alias (__STRFROMF, STRFROMF)
diff --git a/stdlib/strfromd.c b/stdlib/strfromd.c
new file mode 100644
index 0000000..cebe9d5
--- /dev/null
+++ b/stdlib/strfromd.c
@@ -0,0 +1,29 @@
+/* Definitions for strfromd.  Implementation in stdlib/strfrom-skeleton.c.
+
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+   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	FLT		DBL
+#ifdef USE_WIDE_CHAR
+#define STRFROMF	wcsfromd
+#define STRFROMF_L	__wcsfromd_l
+#else
+# define STRFROMF	strfromd
+# define STRFROMF_L	__strfromd_l
+#endif
+
+#include "strfrom-skeleton.c"
diff --git a/stdlib/strfromd_l.c b/stdlib/strfromd_l.c
new file mode 100644
index 0000000..c927d31
--- /dev/null
+++ b/stdlib/strfromd_l.c
@@ -0,0 +1,29 @@
+/* Definitions for strfromd_l.  Implementation in stdlib/strfrom-skeleton_l.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
+#ifdef USE_WIDE_CHAR
+# define STRFROMF		wcsfromd_l
+# define __STRFROMF		__wcsfromd_l
+#else
+# define STRFROMF		strfromd_l
+# define __STRFROMF		__strfromd_l
+#endif
+
+#include "strfrom_l-skeleton.c"
diff --git a/stdlib/strfromf.c b/stdlib/strfromf.c
new file mode 100644
index 0000000..bebdaab
--- /dev/null
+++ b/stdlib/strfromf.c
@@ -0,0 +1,29 @@
+/* Definitions for strfromf.  Implementation in stdlib/strfrom-skeleton.c.
+
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+   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	FLT		FLT
+#ifdef USE_WIDE_CHAR
+#define STRFROMF	wcsfromf
+#define STRFROMF_L	__wcsfromf_l
+#else
+# define STRFROMF	strfromf
+# define STRFROMF_L	__strfromf_l
+#endif
+
+#include "strfrom-skeleton.c"
diff --git a/stdlib/strfromf_l.c b/stdlib/strfromf_l.c
new file mode 100644
index 0000000..a935916
--- /dev/null
+++ b/stdlib/strfromf_l.c
@@ -0,0 +1,29 @@
+/* Definitions for strfromf_l.  Implementation in stdlib/strfrom-skeleton_l.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
+#ifdef USE_WIDE_CHAR
+# define STRFROMF		wcsfromf_l
+# define __STRFROMF		__wcsfromf_l
+#else
+# define STRFROMF		strfromf_l
+# define __STRFROMF		__strfromf_l
+#endif
+
+#include "strfrom_l-skeleton.c"
diff --git a/stdlib/strfroml.c b/stdlib/strfroml.c
new file mode 100644
index 0000000..1685341
--- /dev/null
+++ b/stdlib/strfroml.c
@@ -0,0 +1,29 @@
+/* Definitions for strfroml.  Implementation in stdlib/strfrom-skeleton.c.
+
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+   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	FLT		LDBL
+#ifdef USE_WIDE_CHAR
+#define STRFROMF	wcsfroml
+#define STRFROMF_L	__wcsfroml_l
+#else
+# define STRFROMF	strfroml
+# define STRFROMF_L	__strfroml_l
+#endif
+
+#include "strfrom-skeleton.c"
diff --git a/stdlib/strfroml_l.c b/stdlib/strfroml_l.c
new file mode 100644
index 0000000..79043f0
--- /dev/null
+++ b/stdlib/strfroml_l.c
@@ -0,0 +1,29 @@
+/* Definitions for strfroml_l.  Implementation in stdlib/strfrom-skeleton_l.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
+#ifdef USE_WIDE_CHAR
+# define STRFROMF		wcsfroml_l
+# define __STRFROMF		__wcsfroml_l
+#else
+# define STRFROMF		strfroml_l
+# define __STRFROMF		__strfroml_l
+#endif
+
+#include "strfrom_l-skeleton.c"
diff --git a/sysdeps/arm/nacl/libc.abilist b/sysdeps/arm/nacl/libc.abilist
index 4d3b0b9..2197975 100644
--- a/sysdeps/arm/nacl/libc.abilist
+++ b/sysdeps/arm/nacl/libc.abilist
@@ -1846,3 +1846,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index 2c2f49e..14ae2ad 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2090,3 +2090,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 8afba47..e11af7a 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -2001,6 +2001,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..abbfa63 100644
--- a/sysdeps/unix/sysv/linux/arm/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
@@ -91,6 +91,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..7fee6d7 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -1855,6 +1855,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..ebe80cb 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2013,6 +2013,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..fadc5f7 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -1877,6 +1877,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..f789237 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -92,6 +92,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..b955449 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -1969,6 +1969,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..6463972 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
@@ -2090,3 +2090,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..4908cdb 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -1944,6 +1944,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..c04c6be 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -1942,6 +1942,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..c09a9de 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -1940,6 +1940,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..5b0272c 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -1935,6 +1935,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..a8286f2 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2131,3 +2131,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..67ac0af 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -1973,6 +1973,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..12693a4 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -1978,6 +1978,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..f5ebd66 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
@@ -2178,3 +2178,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
index 6819133..309f3e2 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
@@ -92,6 +92,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..e017e7a 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -1973,6 +1973,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..7ef691e 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -1874,6 +1874,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..0787cbb 100644
--- a/sysdeps/unix/sysv/linux/sh/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
@@ -1859,6 +1859,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..00f5511 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -1965,6 +1965,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..af67301 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -1903,6 +1903,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..4b4ea6b 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
@@ -2097,3 +2097,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..18fe905 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
@@ -2097,3 +2097,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
index f99c298..4b4ea6b 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
@@ -2097,3 +2097,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..ef7d746 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -1854,6 +1854,18 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l 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..e987e29 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2097,3 +2097,15 @@ 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 strfromd_l F
+GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf_l F
+GLIBC_2.25 strfroml F
+GLIBC_2.25 strfroml_l F
+GLIBC_2.25 wcsfromd F
+GLIBC_2.25 wcsfromd_l F
+GLIBC_2.25 wcsfromf F
+GLIBC_2.25 wcsfromf_l F
+GLIBC_2.25 wcsfroml F
+GLIBC_2.25 wcsfroml_l F
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index 9384a10..0244743 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -30,6 +30,8 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
 	    btowc wctob mbsinit \
 	    mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \
 	    mbsnrtowcs wcsnrtombs wcsnlen wcschrnul \
+	    wcsfromd wcsfromf wcsfroml \
+	    wcsfromd_l wcsfromf_l wcsfroml_l \
 	    wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
 	    wcstol_l wcstoul_l wcstoll_l wcstoull_l \
 	    wcstod_l wcstold_l wcstof_l \
@@ -91,6 +93,15 @@ CFLAGS-wcstold_l.c = $(strtox-CFLAGS)
 CFLAGS-wcstof_l.c = $(strtox-CFLAGS)
 CPPFLAGS-tst-wchar-h.c = -D_FORTIFY_SOURCE=2
 
+# 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-wcsfromd.c = $(libio-mtsafe)
+CFLAGS-wcsfromd_l.c = $(libio-mtsafe)
+CFLAGS-wcsfromf.c = $(libio-mtsafe)
+CFLAGS-wcsfromf_l.c = $(libio-mtsafe)
+CFLAGS-wcsfroml.c = $(libio-mtsafe)
+CFLAGS-wcsfroml_l.c = $(libio-mtsafe)
+
 CFLAGS-isoc99_wscanf.c += -fexceptions
 CFLAGS-isoc99_fwscanf.c += -fexceptions
 CFLAGS-isoc99_vwscanf.c += -fexceptions
diff --git a/wcsmbs/Versions b/wcsmbs/Versions
index 1ff5ff3..b29a303 100644
--- a/wcsmbs/Versions
+++ b/wcsmbs/Versions
@@ -31,4 +31,7 @@ libc {
   GLIBC_2.16 {
     c16rtomb; c32rtomb; mbrtoc16; mbrtoc32;
   }
+  GLIBC_2.25 {
+    wcsfromd; wcsfromf; wcsfroml;
+  }
 }
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index 9686fcd..87ad0f5 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -453,6 +453,12 @@ __BEGIN_NAMESPACE_STD
    representation.  */
 extern double wcstod (const wchar_t *__restrict __nptr,
 		      wchar_t **__restrict __endptr) __THROW;
+/* Convert the floating-point value f, in `double' representation, to the wide
+   string `dest'.  */
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+extern int wcsfromd (wchar_t * __dest, size_t __size, const char * __format,
+		     double __f) __THROW __nonnull ((3));
+#endif
 __END_NAMESPACE_STD
 
 #ifdef __USE_ISOC99
@@ -462,6 +468,12 @@ extern float wcstof (const wchar_t *__restrict __nptr,
 		     wchar_t **__restrict __endptr) __THROW;
 extern long double wcstold (const wchar_t *__restrict __nptr,
 			    wchar_t **__restrict __endptr) __THROW;
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+extern int wcsfromf (wchar_t * __dest, size_t __size, const char * __format,
+		     float __f) __THROW __nonnull ((3));
+extern int wcsfroml (wchar_t * __dest, size_t __size, const char * __format,
+		     long double __f) __THROW __nonnull ((3));
+#endif
 __END_NAMESPACE_C99
 #endif /* C99 */
 
@@ -561,6 +573,17 @@ extern float wcstof_l (const wchar_t *__restrict __nptr,
 extern long double wcstold_l (const wchar_t *__restrict __nptr,
 			      wchar_t **__restrict __endptr,
 			      __locale_t __loc) __THROW;
+
+/* Same thing for wcsfrom functions.  */
+extern int wcsfromd_l (wchar_t *__restrict __dest, size_t __size,
+		       const char *__format, double __f, __locale_t __loc)
+     __THROW __nonnull ((3));
+extern int wcsfromf_l (wchar_t *__restrict __dest, size_t __size,
+		       const char *, float __f, __locale_t __loc)
+     __THROW __nonnull ((3));
+extern int wcsfroml_l (wchar_t *__restrict __dest, size_t __size,
+		       const char *__format, long double __f, __locale_t __loc)
+     __THROW __nonnull ((3));
 #endif	/* use GNU */
 
 
diff --git a/wcsmbs/wcsfromd.c b/wcsmbs/wcsfromd.c
new file mode 100644
index 0000000..b9ac076
--- /dev/null
+++ b/wcsmbs/wcsfromd.c
@@ -0,0 +1,25 @@
+/* Convert double to string representation.
+
+   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 <stddef.h>
+#include <xlocale.h>
+
+#define USE_WIDE_CHAR	1
+
+#include <stdlib/strfromd.c>
diff --git a/wcsmbs/wcsfromd_l.c b/wcsmbs/wcsfromd_l.c
new file mode 100644
index 0000000..824ee23
--- /dev/null
+++ b/wcsmbs/wcsfromd_l.c
@@ -0,0 +1,25 @@
+/* Convert double to string representation, using given locale.
+
+   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 <stddef.h>
+#include <xlocale.h>
+
+#define USE_WIDE_CHAR	1
+
+#include <stdlib/strfromd_l.c>
diff --git a/wcsmbs/wcsfromf.c b/wcsmbs/wcsfromf.c
new file mode 100644
index 0000000..1ca0980
--- /dev/null
+++ b/wcsmbs/wcsfromf.c
@@ -0,0 +1,25 @@
+/* Convert float to string representation.
+
+   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 <stddef.h>
+#include <xlocale.h>
+
+#define USE_WIDE_CHAR	1
+
+#include <stdlib/strfromf.c>
diff --git a/wcsmbs/wcsfromf_l.c b/wcsmbs/wcsfromf_l.c
new file mode 100644
index 0000000..7827061
--- /dev/null
+++ b/wcsmbs/wcsfromf_l.c
@@ -0,0 +1,25 @@
+/* Convert float to string representation, using given locale.
+
+   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 <stddef.h>
+#include <xlocale.h>
+
+#define USE_WIDE_CHAR	1
+
+#include <stdlib/strfromf_l.c>
diff --git a/wcsmbs/wcsfroml.c b/wcsmbs/wcsfroml.c
new file mode 100644
index 0000000..8225937
--- /dev/null
+++ b/wcsmbs/wcsfroml.c
@@ -0,0 +1,25 @@
+/* Convert long double to string representation.
+
+   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 <stddef.h>
+#include <xlocale.h>
+
+#define USE_WIDE_CHAR	1
+
+#include <stdlib/strfroml.c>
diff --git a/wcsmbs/wcsfroml_l.c b/wcsmbs/wcsfroml_l.c
new file mode 100644
index 0000000..b2183fd
--- /dev/null
+++ b/wcsmbs/wcsfroml_l.c
@@ -0,0 +1,25 @@
+/* Convert long double to string representation, using given locale.
+
+   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 <stddef.h>
+#include <xlocale.h>
+
+#define USE_WIDE_CHAR	1
+
+#include <stdlib/strfroml_l.c>
-- 
2.4.11


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]