djdelorie / rpms / glibc

Forked from rpms/glibc 3 years ago
Clone
421842a
commit e02cabecf0d025ec4f4ddee290bdf7aadb873bb3
421842a
Author: Joseph Myers <joseph@codesourcery.com>
421842a
Date:   Tue Nov 24 22:24:52 2015 +0000
421842a
421842a
    Refactor strtod parsing of NaN payloads.
421842a
    
421842a
    The nan* functions handle their string argument by constructing a
421842a
    NAN(...) string on the stack as a VLA and passing it to strtod
421842a
    functions.
421842a
    
421842a
    This approach has problems discussed in bug 16961 and bug 16962: the
421842a
    stack usage is unbounded, and it gives incorrect results in certain
421842a
    cases where the argument is not a valid n-char-sequence.
421842a
    
421842a
    The natural fix for both issues is to refactor the NaN payload parsing
421842a
    out of strtod into a separate function that the nan* functions can
421842a
    call directly, so that no temporary string needs constructing on the
421842a
    stack at all.  This patch does that refactoring in preparation for
421842a
    fixing those bugs (but without actually using the new functions from
421842a
    nan* - which will also require exporting them from libc at version
421842a
    GLIBC_PRIVATE).  This patch is not intended to change any user-visible
421842a
    behavior, so no tests are added (fixes for the above bugs will of
421842a
    course add tests for them).
421842a
    
421842a
    This patch builds on my recent fixes for strtol and strtod issues in
421842a
    Turkish locales.  Given those fixes, the parsing of NaN payloads is
421842a
    locale-independent; thus, the new functions do not need to take a
421842a
    locale_t argument.
421842a
    
421842a
    Tested for x86_64, x86, mips64 and powerpc.
421842a
    
421842a
    	* stdlib/strtod_nan.c: New file.
421842a
    	* stdlib/strtod_nan_double.h: Likewise.
421842a
    	* stdlib/strtod_nan_float.h: Likewise.
421842a
    	* stdlib/strtod_nan_main.c: Likewise.
421842a
    	* stdlib/strtod_nan_narrow.h: Likewise.
421842a
    	* stdlib/strtod_nan_wide.h: Likewise.
421842a
    	* stdlib/strtof_nan.c: Likewise.
421842a
    	* stdlib/strtold_nan.c: Likewise.
421842a
    	* sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise.
421842a
    	* sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise.
421842a
    	* sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise.
421842a
    	* wcsmbs/wcstod_nan.c: Likewise.
421842a
    	* wcsmbs/wcstof_nan.c: Likewise.
421842a
    	* wcsmbs/wcstold_nan.c: Likewise.
421842a
    	* stdlib/Makefile (routines): Add strtof_nan, strtod_nan and
421842a
    	strtold_nan.
421842a
    	* wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and
421842a
    	wcstof_nan.
421842a
    	* include/stdlib.h (__strtof_nan): Declare and use
421842a
    	libc_hidden_proto.
421842a
    	(__strtod_nan): Likewise.
421842a
    	(__strtold_nan): Likewise.
421842a
    	(__wcstof_nan): Likewise.
421842a
    	(__wcstod_nan): Likewise.
421842a
    	(__wcstold_nan): Likewise.
421842a
    	* include/wchar.h (____wcstoull_l_internal): Declare.
421842a
    	* stdlib/strtod_l.c: Do not include <ieee754.h>.
421842a
    	(____strtoull_l_internal): Remove declaration.
421842a
    	(STRTOF_NAN): Define macro.
421842a
    	(SET_MANTISSA): Remove macro.
421842a
    	(STRTOULL): Likewise.
421842a
    	(____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload.
421842a
    	* stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration.
421842a
    	(STRTOF_NAN): Define macro.
421842a
    	(SET_MANTISSA): Remove macro.
421842a
    	* sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro.
421842a
    	(SET_MANTISSA): Remove macro.
421842a
    	* sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define
421842a
    	macro.
421842a
    	(SET_MANTISSA): Remove macro.
421842a
    	* sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define
421842a
    	macro.
421842a
    	(SET_MANTISSA): Remove macro.
421842a
    	* sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro.
421842a
    	(SET_MANTISSA): Remove macro.
421842a
    	* wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration.
421842a
    	* wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise.
421842a
    	* wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise.
421842a
421842a
Index: b/include/stdlib.h
421842a
===================================================================
421842a
--- a/include/stdlib.h
421842a
+++ b/include/stdlib.h
421842a
@@ -203,6 +203,24 @@ libc_hidden_proto (strtoll)
421842a
 libc_hidden_proto (strtoul)
421842a
 libc_hidden_proto (strtoull)
421842a
 
421842a
+extern float __strtof_nan (const char *, char **, char) internal_function;
421842a
+extern double __strtod_nan (const char *, char **, char) internal_function;
421842a
+extern long double __strtold_nan (const char *, char **, char)
421842a
+     internal_function;
421842a
+extern float __wcstof_nan (const wchar_t *, wchar_t **, wchar_t)
421842a
+     internal_function;
421842a
+extern double __wcstod_nan (const wchar_t *, wchar_t **, wchar_t)
421842a
+     internal_function;
421842a
+extern long double __wcstold_nan (const wchar_t *, wchar_t **, wchar_t)
421842a
+     internal_function;
421842a
+
421842a
+libc_hidden_proto (__strtof_nan)
421842a
+libc_hidden_proto (__strtod_nan)
421842a
+libc_hidden_proto (__strtold_nan)
421842a
+libc_hidden_proto (__wcstof_nan)
421842a
+libc_hidden_proto (__wcstod_nan)
421842a
+libc_hidden_proto (__wcstold_nan)
421842a
+
421842a
 extern char *__ecvt (double __value, int __ndigit, int *__restrict __decpt,
421842a
 		     int *__restrict __sign);
421842a
 extern char *__fcvt (double __value, int __ndigit, int *__restrict __decpt,
421842a
Index: b/include/wchar.h
421842a
===================================================================
421842a
--- a/include/wchar.h
421842a
+++ b/include/wchar.h
421842a
@@ -52,6 +52,9 @@ extern unsigned long long int __wcstoull
421842a
 						   __restrict __endptr,
421842a
 						   int __base,
421842a
 						   int __group) __THROW;
421842a
+extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
421842a
+						       wchar_t **, int, int,
421842a
+						       __locale_t);
421842a
 libc_hidden_proto (__wcstof_internal)
421842a
 libc_hidden_proto (__wcstod_internal)
421842a
 libc_hidden_proto (__wcstold_internal)
421842a
Index: b/stdlib/Makefile
421842a
===================================================================
421842a
--- a/stdlib/Makefile
421842a
+++ b/stdlib/Makefile
421842a
@@ -50,6 +50,7 @@ routines	:=							      \
421842a
 	strtol_l strtoul_l strtoll_l strtoull_l				      \
421842a
 	strtof strtod strtold						      \
421842a
 	strtof_l strtod_l strtold_l					      \
421842a
+	strtof_nan strtod_nan strtold_nan				      \
421842a
 	system canonicalize						      \
421842a
 	a64l l64a							      \
421842a
 	rpmatch strfmon strfmon_l getsubopt xpg_basename fmtmsg		      \
421842a
Index: b/stdlib/strtod_l.c
421842a
===================================================================
421842a
--- a/stdlib/strtod_l.c
421842a
+++ b/stdlib/strtod_l.c
421842a
@@ -20,8 +20,6 @@
421842a
 #include <xlocale.h>
421842a
 
421842a
 extern double ____strtod_l_internal (const char *, char **, int, __locale_t);
421842a
-extern unsigned long long int ____strtoull_l_internal (const char *, char **,
421842a
-						       int, int, __locale_t);
421842a
 
421842a
 /* Configuration part.  These macros are defined by `strtold.c',
421842a
    `strtof.c', `wcstod.c', `wcstold.c', and `wcstof.c' to produce the
421842a
@@ -33,27 +31,20 @@ extern unsigned long long int ____strtou
421842a
 # ifdef USE_WIDE_CHAR
421842a
 #  define STRTOF	wcstod_l
421842a
 #  define __STRTOF	__wcstod_l
421842a
+#  define STRTOF_NAN	__wcstod_nan
421842a
 # else
421842a
 #  define STRTOF	strtod_l
421842a
 #  define __STRTOF	__strtod_l
421842a
+#  define STRTOF_NAN	__strtod_nan
421842a
 # endif
421842a
 # define MPN2FLOAT	__mpn_construct_double
421842a
 # define FLOAT_HUGE_VAL	HUGE_VAL
421842a
-# define SET_MANTISSA(flt, mant) \
421842a
-  do { union ieee754_double u;						      \
421842a
-       u.d = (flt);							      \
421842a
-       u.ieee_nan.mantissa0 = (mant) >> 32;				      \
421842a
-       u.ieee_nan.mantissa1 = (mant);					      \
421842a
-       if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0)			      \
421842a
-	 (flt) = u.d;							      \
421842a
-  } while (0)
421842a
 #endif
421842a
 /* End of configuration part.  */
421842a
 
421842a
 #include <ctype.h>
421842a
 #include <errno.h>
421842a
 #include <float.h>
421842a
-#include <ieee754.h>
421842a
 #include "../locale/localeinfo.h"
421842a
 #include <locale.h>
421842a
 #include <math.h>
421842a
@@ -104,7 +95,6 @@ extern unsigned long long int ____strtou
421842a
 # define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr)
421842a
 # define STRNCASECMP(S1, S2, N) \
421842a
   __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr)
421842a
-# define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, loc)
421842a
 #else
421842a
 # define STRING_TYPE char
421842a
 # define CHAR_TYPE char
421842a
@@ -116,7 +106,6 @@ extern unsigned long long int ____strtou
421842a
 # define TOLOWER_C(Ch) __tolower_l ((Ch), _nl_C_locobj_ptr)
421842a
 # define STRNCASECMP(S1, S2, N) \
421842a
   __strncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr)
421842a
-# define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, loc)
421842a
 #endif
421842a
 
421842a
 
421842a
@@ -655,33 +644,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group
421842a
 	  if (*cp == L_('('))
421842a
 	    {
421842a
 	      const STRING_TYPE *startp = cp;
421842a
-	      do
421842a
-		++cp;
421842a
-	      while ((*cp >= L_('0') && *cp <= L_('9'))
421842a
-		     || (*cp >= L_('A') && *cp <= L_('Z'))
421842a
-		     || (*cp >= L_('a') && *cp <= L_('z'))
421842a
-		     || *cp == L_('_'));
421842a
-
421842a
-	      if (*cp != L_(')'))
421842a
-		/* The closing brace is missing.  Only match the NAN
421842a
-		   part.  */
421842a
-		cp = startp;
421842a
+	      STRING_TYPE *endp;
421842a
+	      retval = STRTOF_NAN (cp + 1, &endp, L_(')'));
421842a
+	      if (*endp == L_(')'))
421842a
+		/* Consume the closing parenthesis.  */
421842a
+		cp = endp + 1;
421842a
 	      else
421842a
-		{
421842a
-		  /* This is a system-dependent way to specify the
421842a
-		     bitmask used for the NaN.  We expect it to be
421842a
-		     a number which is put in the mantissa of the
421842a
-		     number.  */
421842a
-		  STRING_TYPE *endp;
421842a
-		  unsigned long long int mant;
421842a
-
421842a
-		  mant = STRTOULL (startp + 1, &endp, 0);
421842a
-		  if (endp == cp)
421842a
-		    SET_MANTISSA (retval, mant);
421842a
-
421842a
-		  /* Consume the closing brace.  */
421842a
-		  ++cp;
421842a
-		}
421842a
+		/* Only match the NAN part.  */
421842a
+		cp = startp;
421842a
 	    }
421842a
 
421842a
 	  if (endptr != NULL)
421842a
Index: b/stdlib/strtod_nan.c
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtod_nan.c
421842a
@@ -0,0 +1,24 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Narrow
421842a
+   strings, double.
421842a
+   Copyright (C) 2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#include <strtod_nan_narrow.h>
421842a
+#include <strtod_nan_double.h>
421842a
+
421842a
+#define STRTOD_NAN __strtod_nan
421842a
+#include <strtod_nan_main.c>
421842a
Index: b/stdlib/strtod_nan_double.h
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtod_nan_double.h
421842a
@@ -0,0 +1,30 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  For double.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#define FLOAT		double
421842a
+#define SET_MANTISSA(flt, mant)				\
421842a
+  do							\
421842a
+    {							\
421842a
+      union ieee754_double u;				\
421842a
+      u.d = (flt);					\
421842a
+      u.ieee_nan.mantissa0 = (mant) >> 32;		\
421842a
+      u.ieee_nan.mantissa1 = (mant);			\
421842a
+      if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0)	\
421842a
+	(flt) = u.d;					\
421842a
+    }							\
421842a
+  while (0)
421842a
Index: b/stdlib/strtod_nan_float.h
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtod_nan_float.h
421842a
@@ -0,0 +1,29 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  For float.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#define	FLOAT		float
421842a
+#define SET_MANTISSA(flt, mant)			\
421842a
+  do						\
421842a
+    {						\
421842a
+      union ieee754_float u;			\
421842a
+      u.f = (flt);				\
421842a
+      u.ieee_nan.mantissa = (mant);		\
421842a
+      if (u.ieee.mantissa != 0)			\
421842a
+	(flt) = u.f;				\
421842a
+    }						\
421842a
+  while (0)
421842a
Index: b/stdlib/strtod_nan_main.c
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtod_nan_main.c
421842a
@@ -0,0 +1,63 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#include <ieee754.h>
421842a
+#include <locale.h>
421842a
+#include <math.h>
421842a
+#include <stdlib.h>
421842a
+#include <wchar.h>
421842a
+
421842a
+
421842a
+/* If STR starts with an optional n-char-sequence as defined by ISO C
421842a
+   (a sequence of ASCII letters, digits and underscores), followed by
421842a
+   ENDC, return a NaN whose payload is set based on STR.  Otherwise,
421842a
+   return a default NAN.  If ENDPTR is not NULL, set *ENDPTR to point
421842a
+   to the character after the initial n-char-sequence.  */
421842a
+
421842a
+internal_function
421842a
+FLOAT
421842a
+STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc)
421842a
+{
421842a
+  const STRING_TYPE *cp = str;
421842a
+
421842a
+  while ((*cp >= L_('0') && *cp <= L_('9'))
421842a
+	 || (*cp >= L_('A') && *cp <= L_('Z'))
421842a
+	 || (*cp >= L_('a') && *cp <= L_('z'))
421842a
+	 || *cp == L_('_'))
421842a
+    ++cp;
421842a
+
421842a
+  FLOAT retval = NAN;
421842a
+  if (*cp != endc)
421842a
+    goto out;
421842a
+
421842a
+  /* This is a system-dependent way to specify the bitmask used for
421842a
+     the NaN.  We expect it to be a number which is put in the
421842a
+     mantissa of the number.  */
421842a
+  STRING_TYPE *endp;
421842a
+  unsigned long long int mant;
421842a
+
421842a
+  mant = STRTOULL (str, &endp, 0);
421842a
+  if (endp == cp)
421842a
+    SET_MANTISSA (retval, mant);
421842a
+
421842a
+ out:
421842a
+  if (endptr != NULL)
421842a
+    *endptr = (STRING_TYPE *) cp;
421842a
+  return retval;
421842a
+}
421842a
+libc_hidden_def (STRTOD_NAN)
421842a
Index: b/stdlib/strtod_nan_narrow.h
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtod_nan_narrow.h
421842a
@@ -0,0 +1,22 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Narrow strings.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#define STRING_TYPE char
421842a
+#define L_(Ch) Ch
421842a
+#define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0,	\
421842a
+						   _nl_C_locobj_ptr)
421842a
Index: b/stdlib/strtod_nan_wide.h
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtod_nan_wide.h
421842a
@@ -0,0 +1,22 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Wide strings.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#define STRING_TYPE wchar_t
421842a
+#define L_(Ch) L##Ch
421842a
+#define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0,	\
421842a
+						   _nl_C_locobj_ptr)
421842a
Index: b/stdlib/strtof_l.c
421842a
===================================================================
421842a
--- a/stdlib/strtof_l.c
421842a
+++ b/stdlib/strtof_l.c
421842a
@@ -20,26 +20,19 @@
421842a
 #include <xlocale.h>
421842a
 
421842a
 extern float ____strtof_l_internal (const char *, char **, int, __locale_t);
421842a
-extern unsigned long long int ____strtoull_l_internal (const char *, char **,
421842a
-						       int, int, __locale_t);
421842a
 
421842a
 #define	FLOAT		float
421842a
 #define	FLT		FLT
421842a
 #ifdef USE_WIDE_CHAR
421842a
 # define STRTOF		wcstof_l
421842a
 # define __STRTOF	__wcstof_l
421842a
+# define STRTOF_NAN	__wcstof_nan
421842a
 #else
421842a
 # define STRTOF		strtof_l
421842a
 # define __STRTOF	__strtof_l
421842a
+# define STRTOF_NAN	__strtof_nan
421842a
 #endif
421842a
 #define	MPN2FLOAT	__mpn_construct_float
421842a
 #define	FLOAT_HUGE_VAL	HUGE_VALF
421842a
-#define SET_MANTISSA(flt, mant) \
421842a
-  do { union ieee754_float u;						      \
421842a
-       u.f = (flt);							      \
421842a
-       u.ieee_nan.mantissa = (mant);					      \
421842a
-       if (u.ieee.mantissa != 0)					      \
421842a
-	 (flt) = u.f;							      \
421842a
-  } while (0)
421842a
 
421842a
 #include "strtod_l.c"
421842a
Index: b/stdlib/strtof_nan.c
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtof_nan.c
421842a
@@ -0,0 +1,24 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Narrow
421842a
+   strings, float.
421842a
+   Copyright (C) 2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#include <strtod_nan_narrow.h>
421842a
+#include <strtod_nan_float.h>
421842a
+
421842a
+#define STRTOD_NAN __strtof_nan
421842a
+#include <strtod_nan_main.c>
421842a
Index: b/stdlib/strtold_nan.c
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/stdlib/strtold_nan.c
421842a
@@ -0,0 +1,30 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Narrow
421842a
+   strings, long double.
421842a
+   Copyright (C) 2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#include <math.h>
421842a
+
421842a
+/* This function is unused if long double and double have the same
421842a
+   representation.  */
421842a
+#ifndef __NO_LONG_DOUBLE_MATH
421842a
+# include <strtod_nan_narrow.h>
421842a
+# include <strtod_nan_ldouble.h>
421842a
+
421842a
+# define STRTOD_NAN __strtold_nan
421842a
+# include <strtod_nan_main.c>
421842a
+#endif
421842a
Index: b/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h
421842a
@@ -0,0 +1,33 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  For ldbl-128.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#define FLOAT		long double
421842a
+#define SET_MANTISSA(flt, mant)				\
421842a
+  do							\
421842a
+    {							\
421842a
+      union ieee854_long_double u;			\
421842a
+      u.d = (flt);					\
421842a
+      u.ieee_nan.mantissa0 = 0;				\
421842a
+      u.ieee_nan.mantissa1 = 0;				\
421842a
+      u.ieee_nan.mantissa2 = (mant) >> 32;		\
421842a
+      u.ieee_nan.mantissa3 = (mant);			\
421842a
+      if ((u.ieee.mantissa0 | u.ieee.mantissa1		\
421842a
+	   | u.ieee.mantissa2 | u.ieee.mantissa3) != 0)	\
421842a
+	(flt) = u.d;					\
421842a
+    }							\
421842a
+  while (0)
421842a
Index: b/sysdeps/ieee754/ldbl-128/strtold_l.c
421842a
===================================================================
421842a
--- a/sysdeps/ieee754/ldbl-128/strtold_l.c
421842a
+++ b/sysdeps/ieee754/ldbl-128/strtold_l.c
421842a
@@ -25,22 +25,13 @@
421842a
 #ifdef USE_WIDE_CHAR
421842a
 # define STRTOF		wcstold_l
421842a
 # define __STRTOF	__wcstold_l
421842a
+# define STRTOF_NAN	__wcstold_nan
421842a
 #else
421842a
 # define STRTOF		strtold_l
421842a
 # define __STRTOF	__strtold_l
421842a
+# define STRTOF_NAN	__strtold_nan
421842a
 #endif
421842a
 #define MPN2FLOAT	__mpn_construct_long_double
421842a
 #define FLOAT_HUGE_VAL	HUGE_VALL
421842a
-#define SET_MANTISSA(flt, mant) \
421842a
-  do { union ieee854_long_double u;					      \
421842a
-       u.d = (flt);							      \
421842a
-       u.ieee_nan.mantissa0 = 0;					      \
421842a
-       u.ieee_nan.mantissa1 = 0;					      \
421842a
-       u.ieee_nan.mantissa2 = (mant) >> 32;				      \
421842a
-       u.ieee_nan.mantissa3 = (mant);					      \
421842a
-       if ((u.ieee.mantissa0 | u.ieee.mantissa1				      \
421842a
-	    | u.ieee.mantissa2 | u.ieee.mantissa3) != 0)		      \
421842a
-	 (flt) = u.d;							      \
421842a
-  } while (0)
421842a
 
421842a
 #include <strtod_l.c>
421842a
Index: b/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h
421842a
@@ -0,0 +1,30 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  For ldbl-128ibm.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#define FLOAT		long double
421842a
+#define SET_MANTISSA(flt, mant)					\
421842a
+  do								\
421842a
+    {								\
421842a
+      union ibm_extended_long_double u;				\
421842a
+      u.ld = (flt);						\
421842a
+      u.d[0].ieee_nan.mantissa0 = (mant) >> 32;			\
421842a
+      u.d[0].ieee_nan.mantissa1 = (mant);			\
421842a
+      if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0)	\
421842a
+	(flt) = u.ld;						\
421842a
+    }								\
421842a
+  while (0)
421842a
Index: b/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
421842a
===================================================================
421842a
--- a/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
421842a
+++ b/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
421842a
@@ -30,25 +30,19 @@ extern long double ____new_wcstold_l (co
421842a
 # define STRTOF		__new_wcstold_l
421842a
 # define __STRTOF	____new_wcstold_l
421842a
 # define ____STRTOF_INTERNAL ____wcstold_l_internal
421842a
+# define STRTOF_NAN	__wcstold_nan
421842a
 #else
421842a
 extern long double ____new_strtold_l (const char *, char **, __locale_t);
421842a
 # define STRTOF		__new_strtold_l
421842a
 # define __STRTOF	____new_strtold_l
421842a
 # define ____STRTOF_INTERNAL ____strtold_l_internal
421842a
+# define STRTOF_NAN	__strtold_nan
421842a
 #endif
421842a
 extern __typeof (__STRTOF) STRTOF;
421842a
 libc_hidden_proto (__STRTOF)
421842a
 libc_hidden_proto (STRTOF)
421842a
 #define MPN2FLOAT	__mpn_construct_long_double
421842a
 #define FLOAT_HUGE_VAL	HUGE_VALL
421842a
-# define SET_MANTISSA(flt, mant) \
421842a
-  do { union ibm_extended_long_double u;				      \
421842a
-       u.ld = (flt);							      \
421842a
-       u.d[0].ieee_nan.mantissa0 = (mant) >> 32;			      \
421842a
-       u.d[0].ieee_nan.mantissa1 = (mant);				      \
421842a
-       if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0)	      \
421842a
-	 (flt) = u.ld;							      \
421842a
-  } while (0)
421842a
 
421842a
 #include <strtod_l.c>
421842a
 
421842a
Index: b/sysdeps/ieee754/ldbl-64-128/strtold_l.c
421842a
===================================================================
421842a
--- a/sysdeps/ieee754/ldbl-64-128/strtold_l.c
421842a
+++ b/sysdeps/ieee754/ldbl-64-128/strtold_l.c
421842a
@@ -30,28 +30,19 @@ extern long double ____new_wcstold_l (co
421842a
 # define STRTOF		__new_wcstold_l
421842a
 # define __STRTOF	____new_wcstold_l
421842a
 # define ____STRTOF_INTERNAL ____wcstold_l_internal
421842a
+# define STRTOF_NAN	__wcstold_nan
421842a
 #else
421842a
 extern long double ____new_strtold_l (const char *, char **, __locale_t);
421842a
 # define STRTOF		__new_strtold_l
421842a
 # define __STRTOF	____new_strtold_l
421842a
 # define ____STRTOF_INTERNAL ____strtold_l_internal
421842a
+# define STRTOF_NAN	__strtold_nan
421842a
 #endif
421842a
 extern __typeof (__STRTOF) STRTOF;
421842a
 libc_hidden_proto (__STRTOF)
421842a
 libc_hidden_proto (STRTOF)
421842a
 #define MPN2FLOAT	__mpn_construct_long_double
421842a
 #define FLOAT_HUGE_VAL	HUGE_VALL
421842a
-#define SET_MANTISSA(flt, mant) \
421842a
-  do { union ieee854_long_double u;					      \
421842a
-       u.d = (flt);							      \
421842a
-       u.ieee_nan.mantissa0 = 0;					      \
421842a
-       u.ieee_nan.mantissa1 = 0;					      \
421842a
-       u.ieee_nan.mantissa2 = (mant) >> 32;				      \
421842a
-       u.ieee_nan.mantissa3 = (mant);					      \
421842a
-       if ((u.ieee.mantissa0 | u.ieee.mantissa1				      \
421842a
-	    | u.ieee.mantissa2 | u.ieee.mantissa3) != 0)		      \
421842a
-	 (flt) = u.d;							      \
421842a
-  } while (0)
421842a
 
421842a
 #include <strtod_l.c>
421842a
 
421842a
Index: b/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h
421842a
@@ -0,0 +1,30 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  For ldbl-96.
421842a
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#define FLOAT		long double
421842a
+#define SET_MANTISSA(flt, mant)				\
421842a
+  do							\
421842a
+    {							\
421842a
+      union ieee854_long_double u;			\
421842a
+      u.d = (flt);					\
421842a
+      u.ieee_nan.mantissa0 = (mant) >> 32;		\
421842a
+      u.ieee_nan.mantissa1 = (mant);			\
421842a
+      if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0)	\
421842a
+	(flt) = u.d;					\
421842a
+    }							\
421842a
+  while (0)
421842a
Index: b/sysdeps/ieee754/ldbl-96/strtold_l.c
421842a
===================================================================
421842a
--- a/sysdeps/ieee754/ldbl-96/strtold_l.c
421842a
+++ b/sysdeps/ieee754/ldbl-96/strtold_l.c
421842a
@@ -25,19 +25,13 @@
421842a
 #ifdef USE_WIDE_CHAR
421842a
 # define STRTOF		wcstold_l
421842a
 # define __STRTOF	__wcstold_l
421842a
+# define STRTOF_NAN	__wcstold_nan
421842a
 #else
421842a
 # define STRTOF		strtold_l
421842a
 # define __STRTOF	__strtold_l
421842a
+# define STRTOF_NAN	__strtold_nan
421842a
 #endif
421842a
 #define MPN2FLOAT	__mpn_construct_long_double
421842a
 #define FLOAT_HUGE_VAL	HUGE_VALL
421842a
-#define SET_MANTISSA(flt, mant) \
421842a
-  do { union ieee854_long_double u;					      \
421842a
-       u.d = (flt);							      \
421842a
-       u.ieee_nan.mantissa0 = (mant) >> 32;				      \
421842a
-       u.ieee_nan.mantissa1 = (mant);					      \
421842a
-       if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0)			      \
421842a
-	 (flt) = u.d;							      \
421842a
-  } while (0)
421842a
 
421842a
 #include <stdlib/strtod_l.c>
421842a
Index: b/wcsmbs/Makefile
421842a
===================================================================
421842a
--- a/wcsmbs/Makefile
421842a
+++ b/wcsmbs/Makefile
421842a
@@ -33,6 +33,7 @@ routines := wcscat wcschr wcscmp wcscpy
421842a
 	    wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
421842a
 	    wcstol_l wcstoul_l wcstoll_l wcstoull_l \
421842a
 	    wcstod_l wcstold_l wcstof_l \
421842a
+	    wcstod_nan wcstold_nan wcstof_nan \
421842a
 	    wcscoll wcsxfrm \
421842a
 	    wcwidth wcswidth \
421842a
 	    wcscoll_l wcsxfrm_l \
421842a
Index: b/wcsmbs/wcstod_l.c
421842a
===================================================================
421842a
--- a/wcsmbs/wcstod_l.c
421842a
+++ b/wcsmbs/wcstod_l.c
421842a
@@ -23,9 +23,6 @@
421842a
 
421842a
 extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
421842a
 				     __locale_t);
421842a
-extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
421842a
-						       wchar_t **, int, int,
421842a
-						       __locale_t);
421842a
 
421842a
 #define	USE_WIDE_CHAR	1
421842a
 
421842a
Index: b/wcsmbs/wcstod_nan.c
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/wcsmbs/wcstod_nan.c
421842a
@@ -0,0 +1,23 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Wide strings, double.
421842a
+   Copyright (C) 2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#include "../stdlib/strtod_nan_wide.h"
421842a
+#include "../stdlib/strtod_nan_double.h"
421842a
+
421842a
+#define STRTOD_NAN __wcstod_nan
421842a
+#include "../stdlib/strtod_nan_main.c"
421842a
Index: b/wcsmbs/wcstof_l.c
421842a
===================================================================
421842a
--- a/wcsmbs/wcstof_l.c
421842a
+++ b/wcsmbs/wcstof_l.c
421842a
@@ -25,8 +25,5 @@
421842a
 
421842a
 extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int,
421842a
 				    __locale_t);
421842a
-extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
421842a
-						       wchar_t **, int, int,
421842a
-						       __locale_t);
421842a
 
421842a
 #include <stdlib/strtof_l.c>
421842a
Index: b/wcsmbs/wcstof_nan.c
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/wcsmbs/wcstof_nan.c
421842a
@@ -0,0 +1,23 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Wide strings, float.
421842a
+   Copyright (C) 2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#include "../stdlib/strtod_nan_wide.h"
421842a
+#include "../stdlib/strtod_nan_float.h"
421842a
+
421842a
+#define STRTOD_NAN __wcstof_nan
421842a
+#include "../stdlib/strtod_nan_main.c"
421842a
Index: b/wcsmbs/wcstold_l.c
421842a
===================================================================
421842a
--- a/wcsmbs/wcstold_l.c
421842a
+++ b/wcsmbs/wcstold_l.c
421842a
@@ -24,8 +24,5 @@
421842a
 
421842a
 extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int,
421842a
 					   __locale_t);
421842a
-extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
421842a
-						       wchar_t **, int, int,
421842a
-						       __locale_t);
421842a
 
421842a
 #include <strtold_l.c>
421842a
Index: b/wcsmbs/wcstold_nan.c
421842a
===================================================================
421842a
--- /dev/null
421842a
+++ b/wcsmbs/wcstold_nan.c
421842a
@@ -0,0 +1,30 @@
421842a
+/* Convert string for NaN payload to corresponding NaN.  Wide strings,
421842a
+   long double.
421842a
+   Copyright (C) 2015 Free Software Foundation, Inc.
421842a
+   This file is part of the GNU C Library.
421842a
+
421842a
+   The GNU C Library is free software; you can redistribute it and/or
421842a
+   modify it under the terms of the GNU Lesser General Public
421842a
+   License as published by the Free Software Foundation; either
421842a
+   version 2.1 of the License, or (at your option) any later version.
421842a
+
421842a
+   The GNU C Library is distributed in the hope that it will be useful,
421842a
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
421842a
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
421842a
+   Lesser General Public License for more details.
421842a
+
421842a
+   You should have received a copy of the GNU Lesser General Public
421842a
+   License along with the GNU C Library; if not, see
421842a
+   <http://www.gnu.org/licenses/>.  */
421842a
+
421842a
+#include <math.h>
421842a
+
421842a
+/* This function is unused if long double and double have the same
421842a
+   representation.  */
421842a
+#ifndef __NO_LONG_DOUBLE_MATH
421842a
+# include "../stdlib/strtod_nan_wide.h"
421842a
+# include <strtod_nan_ldouble.h>
421842a
+
421842a
+# define STRTOD_NAN __wcstold_nan
421842a
+# include "../stdlib/strtod_nan_main.c"
421842a
+#endif