diff --git a/ChangeLog b/ChangeLog index 9a15349887..16efc6a08a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-12-11 Ulrich Drepper + + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand + separators also if no non-zero digits found. + * stdlib/Makefile (tests): Add tst-strtod3. + 2006-12-09 Ulrich Drepper [BZ #3632] diff --git a/stdlib/Makefile b/stdlib/Makefile index 37400ec547..64a237f820 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -67,7 +67,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ tst-xpg-basename tst-random tst-random2 tst-bsearch \ tst-limits tst-rand48 bug-strtod tst-setcontext \ test-a64l tst-qsort tst-system testmb2 bug-strtod2 \ - tst-atof1 tst-atof2 tst-strtod2 + tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 include ../Makeconfig diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c index b926aeba56..b4e4819c87 100644 --- a/stdlib/strtod_l.c +++ b/stdlib/strtod_l.c @@ -721,7 +721,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) c = *++cp; } - if (grouping && dig_no > 0) + if (grouping && cp > start_of_digits) { /* Check the grouping of the digits. */ #ifdef USE_WIDE_CHAR diff --git a/stdlib/tst-atof1.c b/stdlib/tst-atof1.c new file mode 100644 index 0000000000..879d866558 --- /dev/null +++ b/stdlib/tst-atof1.c @@ -0,0 +1,19 @@ +#include +#include +#include + +static int +do_test (void) +{ + char buf[100]; + snprintf (buf, sizeof (buf), "%g", atof ("0x10p-1")); + if (strcmp (buf, "8") != 0) + { + printf ("got \"%s\", expected \"8\"\n", buf); + return 1; + } + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/stdlib/tst-strtod2.c b/stdlib/tst-strtod2.c new file mode 100644 index 0000000000..925ea9cafa --- /dev/null +++ b/stdlib/tst-strtod2.c @@ -0,0 +1,25 @@ +#include +#include + +static int +do_test (void) +{ + int status = 0; + const char s[] = "0x"; + char *ep; + double r = strtod (s, &ep); + if (r != 0) + { + printf ("r = %g, expect 0\n", r); + status = 1; + } + if (ep != s + 1) + { + printf ("strtod parsed %ju characters, expected 1\n", ep - s); + status = 1; + } + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/stdlib/tst-strtod3.c b/stdlib/tst-strtod3.c new file mode 100644 index 0000000000..23abec1896 --- /dev/null +++ b/stdlib/tst-strtod3.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +static const struct +{ + const char *in; + const char *out; + double expected; +} tests[] = + { + { "000,,,e1", ",,,e1", 0.0 }, + { "000e1", "", 0.0 }, + { "000,1e1", ",1e1", 0.0 } + }; +#define NTESTS (sizeof (tests) / sizeof (tests[0])) + + +static int +do_test (void) +{ + if (setlocale (LC_ALL, "en_US.ISO-8859-1") == NULL) + { + puts ("could not set locale"); + return 1; + } + + int status = 0; + + for (int i = 0; i < NTESTS; ++i) + { + char *ep; + double r = __strtod_internal (tests[i].in, &ep, 1); + + if (strcmp (ep, tests[i].out) != 0) + { + printf ("%d: got rest string \"%s\", expected \"%s\"\n", + i, ep, tests[i].out); + status = 1; + } + + if (r != tests[i].expected) + { + printf ("%d: got wrong results %g, expected %g\n", + i, r, tests[i].expected); + status = 1; + } + } + + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c"