changeset 40169:ecb43221748b

strtod, strtold: Work around HP-UX 11.31/ia64 bug. * lib/strtod.c (STRTOD): When there is an extra character after the exponent marker 'p', reparse the number. * doc/posix-functions/strtod.texi: Document the HP-UX 11.31 bug. * doc/posix-functions/strtold.texi: Likewise.
author Bruno Haible <bruno@clisp.org>
date Fri, 01 Feb 2019 00:18:57 +0100
parents f533980eb42f
children 201ca4418b4b
files ChangeLog doc/posix-functions/strtod.texi doc/posix-functions/strtold.texi lib/strtod.c
diffstat 4 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Jan 31 13:24:44 2019 -0800
+++ b/ChangeLog	Fri Feb 01 00:18:57 2019 +0100
@@ -1,3 +1,11 @@
+2019-01-31  Bruno Haible  <bruno@clisp.org>
+
+	strtod, strtold: Work around HP-UX 11.31/ia64 bug.
+	* lib/strtod.c (STRTOD): When there is an extra character after the
+	exponent marker 'p', reparse the number.
+	* doc/posix-functions/strtod.texi: Document the HP-UX 11.31 bug.
+	* doc/posix-functions/strtold.texi: Likewise.
+
 2019-01-29  Bruno Haible  <bruno@clisp.org>
 
 	strtold: Add tests.
--- a/doc/posix-functions/strtod.texi	Thu Jan 31 13:24:44 2019 -0800
+++ b/doc/posix-functions/strtod.texi	Fri Feb 01 00:18:57 2019 +0100
@@ -59,6 +59,11 @@
 Solaris 11.4, mingw, MSVC 14.
 
 @item
+In hexadecimal floats, this function allows whitespace between @samp{p}
+and the exponent on some platforms:
+HP-UX 11.31/ia64.
+
+@item
 This function returns the wrong end pointer for @samp{0x1p} on some
 platforms:
 AIX 7.1.
--- a/doc/posix-functions/strtold.texi	Thu Jan 31 13:24:44 2019 -0800
+++ b/doc/posix-functions/strtold.texi	Fri Feb 01 00:18:57 2019 +0100
@@ -57,6 +57,11 @@
 This function fails to parse C99 hexadecimal floating point on some
 platforms:
 IRIX 6.5, mingw.
+
+@item
+In hexadecimal floats, this function allows whitespace between @samp{p}
+and the exponent on some platforms:
+HP-UX 11.31/ia64.
 @end itemize
 
 Portability problems not fixed by Gnulib:
--- a/lib/strtod.c	Thu Jan 31 13:24:44 2019 -0800
+++ b/lib/strtod.c	Fri Feb 01 00:18:57 2019 +0100
@@ -297,7 +297,25 @@
               while (p < end && c_tolower (*p) != 'p')
                 p++;
               if (p < end && ! c_isdigit (p[1 + (p[1] == '-' || p[1] == '+')]))
-                end = p;
+                {
+                  char *dup = strdup (s);
+                  errno = saved_errno;
+                  if (!dup)
+                    {
+                      /* Not really our day, is it.  Rounding errors are
+                         better than outright failure.  */
+                      num = parse_number (s + 2, 16, 2, 4, 'p', &endbuf);
+                    }
+                  else
+                    {
+                      dup[p - s] = '\0';
+                      num = STRTOD (dup, &endbuf);
+                      saved_errno = errno;
+                      free (dup);
+                      errno = saved_errno;
+                    }
+                  end = p;
+                }
             }
         }
       else