X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-strtod.c;h=327da4f29fb8f7d422cdfefb818e62da9ddf3e30;hb=69be788393cc7d52413d9d2782117326d4c15899;hp=03ec5023a2c16bada51c2d391425fe7f731c984b;hpb=f4c549fab688ce822556eadcf60fdda5042ade11;p=gnulib.git diff --git a/tests/test-strtod.c b/tests/test-strtod.c index 03ec5023a..327da4f29 100644 --- a/tests/test-strtod.c +++ b/tests/test-strtod.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. + * Copyright (C) 2008-2011 Free Software Foundation, Inc. * Written by Eric Blake * * This program is free software: you can redistribute it and/or modify @@ -28,15 +28,12 @@ SIGNATURE_CHECK (strtod, double, (char const *, char **)); #include #include "isnand-nolibm.h" +#include "minus-zero.h" #include "macros.h" /* Avoid requiring -lm just for fabs. */ #define FABS(d) ((d) < 0.0 ? -(d) : (d)) -/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. - So we use -zero instead. */ -double zero = 0.0; - int main (void) { @@ -312,7 +309,7 @@ main (void) errno = 0; result = strtod (input, &ptr); ASSERT (result == 0.0); - ASSERT (!!signbit (result) == !!signbit (-zero)); /* IRIX 6.5, OSF/1 4.0 */ + ASSERT (!!signbit (result) == !!signbit (minus_zerod)); /* IRIX 6.5, OSF/1 4.0 */ ASSERT (ptr == input + 2); ASSERT (errno == 0); } @@ -407,7 +404,7 @@ main (void) errno = 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 (!!signbit (result) == !!signbit (minus_zerod)); /* 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, AIX 7.1 */ ASSERT (errno == 0); } @@ -434,6 +431,17 @@ main (void) ASSERT (errno == 0); } { + const char input[] = "0XP"; + char *ptr; + double result; + errno = 0; + 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, AIX 7.1 */ + ASSERT (errno == 0); + } + { const char input[] = "0x."; char *ptr; double result; @@ -487,6 +495,16 @@ main (void) ASSERT (ptr == input + 1); ASSERT (errno == 0); } + { + const char input[] = "1P+1"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 1.0); + ASSERT (ptr == input + 1); + ASSERT (errno == 0); + } /* Overflow/underflow. */ { @@ -532,11 +550,31 @@ main (void) 0 on negative underflow, even though quality of implementation demands preserving the sign. Disable this test until fixed glibc is more prevalent. */ - ASSERT (!!signbit (result) == !!signbit (-zero)); /* glibc-2.3.6, mingw */ + ASSERT (!!signbit (result) == !!signbit (minus_zerod)); /* glibc-2.3.6, mingw */ #endif ASSERT (ptr == input + 10); ASSERT (errno == ERANGE); } + { + const char input[] = "1E 1000000"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 1.0); /* HP-UX 11.11, IRIX 6.5, OSF/1 4.0 */ + ASSERT (ptr == input + 1); /* HP-UX 11.11, IRIX 6.5 */ + ASSERT (errno == 0); + } + { + const char input[] = "0x1P 1000000"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + 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 */ + ASSERT (errno == 0); + } /* Infinity. */ { @@ -771,6 +809,16 @@ main (void) ASSERT (errno == 0); } { + const char input[] = "0x1P+"; + char *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 (errno == 0); + } + { const char input[] = "0x1p+1"; char *ptr; double result; @@ -781,6 +829,16 @@ main (void) ASSERT (errno == 0); } { + const char input[] = "0X1P+1"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 2.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 + 6); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */ + ASSERT (errno == 0); + } + { const char input[] = "0x1p+1a"; char *ptr; double result; @@ -790,6 +848,16 @@ main (void) ASSERT (ptr == input + 6); /* NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11.11, IRIX 6.5, OSF/1 5.1, Solaris 10, mingw */ ASSERT (errno == 0); } + { + const char input[] = "0x1p 2"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + 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 */ + ASSERT (errno == 0); + } /* Large buffers. */ { @@ -901,7 +969,7 @@ main (void) errno = 0; result = strtod (input, &ptr); ASSERT (result == 0.0); - ASSERT (!!signbit (result) == !!signbit (-zero)); /* IRIX 6.5, OSF/1 4.0 */ + ASSERT (!!signbit (result) == !!signbit (minus_zerod)); /* IRIX 6.5, OSF/1 4.0 */ ASSERT (ptr == input + m); ASSERT (errno == 0); }