* lib/strtod.c (strtod): Special case broken "0x" parse in
underlying strtod.
* tests/test-strtod.c (main): Document AIX 7.1 bugs.
* doc/posix-functions/strtod.texi (strtod): Likewise.
Reported by Rainer Tammer.
Signed-off-by: Eric Blake <eblake@redhat.com>
+2010-07-30 Eric Blake <eblake@redhat.com>
+
+ strtod: fix bug in replacement function on AIX
+ * lib/strtod.c (strtod): Special case broken "0x" parse in
+ underlying strtod.
+ * tests/test-strtod.c (main): Document AIX 7.1 bugs.
+ * doc/posix-functions/strtod.texi (strtod): Likewise.
+ Reported by Rainer Tammer.
+
2010-07-30 Bruno Haible <bruno@clisp.org>
mbrlen: Fix cross-compilation guess for AIX.
2010-07-30 Bruno Haible <bruno@clisp.org>
mbrlen: Fix cross-compilation guess for AIX.
@item
This function returns the wrong end pointer for @samp{-0x} on some
platforms:
@item
This function returns the wrong end pointer for @samp{-0x} on some
platforms:
-glibc 2.4, MacOS X 10.3, FreeBSD 6.2, Cygwin < 1.5.25-11.
+glibc 2.4, MacOS X 10.3, FreeBSD 6.2, AIX 7.1, Cygwin < 1.5.25-11.
@item
This function returns +0.0 (not -0.0) for @samp{-0} on some platforms:
@item
This function returns +0.0 (not -0.0) for @samp{-0} on some platforms:
@item
This function fails to parse @samp{NaN()} on some platforms:
@item
This function fails to parse @samp{NaN()} on some platforms:
-glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Cygwin < 1.5.25-11, mingw.
+glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Cygwin < 1.5.25-11, mingw.
@item
This function fails to parse @samp{NaN(@var{n-char-sequence})} on some
@item
This function fails to parse @samp{NaN(@var{n-char-sequence})} on some
@item
This function parses @samp{NaN(@var{n-char-sequence})}, but returns
the wrong end pointer on some platforms:
@item
This function parses @samp{NaN(@var{n-char-sequence})}, but returns
the wrong end pointer on some platforms:
@item
This function fails to parse C99 hexadecimal floating point on some
@item
This function fails to parse C99 hexadecimal floating point on some
if (c_isdigit (s[*s == '.']))
{
if (c_isdigit (s[*s == '.']))
{
- /* If a hex float was converted incorrectly, do it ourselves. */
- if (*s == '0' && c_tolower (s[1]) == 'x' && end <= s + 2
- && c_isxdigit (s[2 + (s[2] == '.')]))
- num = parse_number (s + 2, 16, 2, 4, 'p', &end);
+ /* If a hex float was converted incorrectly, do it ourselves.
+ If the string starts with "0x", consume the "0" ourselves. */
+ if (*s == '0' && c_tolower (s[1]) == 'x' && end <= s + 2)
+ {
+ if (c_isxdigit (s[2 + (s[2] == '.')]))
+ num = parse_number (s + 2, 16, 2, 4, 'p', &end);
+ else
+ end = s + 1;
+ }
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
- ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!!signbit (result) == !!signbit (-zero)); /* MacOS X 10.3, FreeBSD 6.2, IRIX 6.5, OSF/1 4.0 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!!signbit (result) == !!signbit (-zero)); /* MacOS X 10.3, FreeBSD 6.2, IRIX 6.5, OSF/1 4.0 */
- ASSERT (ptr == input + 2); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 2); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
- ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
- ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
- ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
- ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
- ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
result = strtod (input, &ptr);
ASSERT (result == 0.0);
ASSERT (!signbit (result));
- ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2 */
+ ASSERT (ptr == input + 1); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, AIX 7.1 */
worrying about. */
ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
# endif
worrying about. */
ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
# endif
- ASSERT (ptr1 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
- ASSERT (ptr2 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr1 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr2 == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
ASSERT (errno == 0);
#else
ASSERT (result1 == 0.0);
ASSERT (errno == 0);
#else
ASSERT (result1 == 0.0);
result = strtod (input, &ptr);
#if 1 /* All known CPUs support NaNs. */
ASSERT (isnand (result)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
result = strtod (input, &ptr);
#if 1 /* All known CPUs support NaNs. */
ASSERT (isnand (result)); /* OpenBSD 4.0, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
- ASSERT (ptr == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr == input + 6); /* glibc-2.3.6, MacOS X 10.3, FreeBSD 6.2, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
ASSERT (errno == 0);
#else
ASSERT (result == 0.0);
ASSERT (errno == 0);
#else
ASSERT (result == 0.0);
worrying about. */
ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
# endif
worrying about. */
ASSERT (!!signbit (result1) != !!signbit (result2)); /* glibc-2.3.6, IRIX 6.5, OSF/1 5.1, mingw */
# endif
- ASSERT (ptr1 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
- ASSERT (ptr2 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr1 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
+ ASSERT (ptr2 == input + 7); /* glibc-2.3.6, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, mingw */
ASSERT (errno == 0);
#else
ASSERT (result1 == 0.0);
ASSERT (errno == 0);
#else
ASSERT (result1 == 0.0);
double result;
errno = 0;
result = strtod (input, &ptr);
double result;
errno = 0;
result = strtod (input, &ptr);
- ASSERT (result == 1.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
- ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (result == 1.0); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */
+ ASSERT (ptr == input + 3); /* NetBSD 3.0, OpenBSD 4.0, AIX 7.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */