aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/Makefile17
-rw-r--r--stdlib/tst-strtod.c67
-rw-r--r--stdlib/tst-strtod1i.c84
-rw-r--r--stdlib/tst-strtod5.c75
-rw-r--r--stdlib/tst-strtod5i.c100
5 files changed, 235 insertions, 108 deletions
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 4206f2566e..9b0acce8cc 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -69,23 +69,26 @@ test-srcs := tst-fmtmsg
tests := tst-strtol tst-strtod testmb testrand testsort testdiv \
test-canon test-canon2 tst-strtoll tst-environ \
tst-xpg-basename tst-random tst-random2 tst-bsearch \
- tst-limits tst-rand48 bug-strtod tst-setcontext \
+ tst-limits tst-rand48 bug-strtod tst-setcontext \
tst-setcontext2 test-a64l tst-qsort tst-system testmb2 \
- bug-strtod2 tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 \
- tst-rand48-2 tst-makecontext tst-strtod4 tst-strtod5 \
+ bug-strtod2 tst-atof1 tst-atof2 tst-strtod2 \
+ tst-rand48-2 tst-makecontext tst-strtod5 \
tst-qsort2 tst-makecontext2 tst-strtod6 tst-unsetenv1 \
tst-makecontext3 bug-getcontext bug-fmtmsg1 \
tst-secure-getenv tst-strtod-overflow tst-strtod-round \
- tst-tininess tst-strtod-underflow tst-tls-atexit \
- tst-setcontext3 tst-tls-atexit-nodelete \
+ tst-tininess tst-strtod-underflow tst-setcontext3 \
tst-strtol-locale tst-strtod-nan-locale tst-strfmon_l \
tst-quick_exit tst-thread-quick_exit tst-width \
- tst-width-stdint tst-strfrom tst-strfrom-locale \
+ tst-width-stdint tst-strfrom tst-strfrom-locale \
tst-getrandom
+tests-internal := tst-strtod1i tst-strtod3 tst-strtod4 tst-strtod5i \
+ tst-tls-atexit tst-tls-atexit-nodelete
+tests-static := tst-secure-getenv
+
ifeq ($(build-hardcoded-path-in-tests),yes)
tests += tst-empty-env
endif
-tests-static := tst-secure-getenv
+
ifeq ($(have-cxx-thread_local),yes)
CFLAGS-tst-quick_exit.o = -std=c++11
LDLIBS-tst-quick_exit = -lstdc++
diff --git a/stdlib/tst-strtod.c b/stdlib/tst-strtod.c
index ced6d8a351..1ab7f8a5aa 100644
--- a/stdlib/tst-strtod.c
+++ b/stdlib/tst-strtod.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
+/* Basic tests for strtod.
+ Copyright (C) 1991-2017 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -79,7 +80,6 @@ static const struct ltest tests[] =
static void expand (char *dst, int c);
static int long_dbl (void);
-static int locale_test (void);
static int
do_test (void)
@@ -176,8 +176,6 @@ do_test (void)
status |= long_dbl ();
- status |= locale_test ();
-
return status ? EXIT_FAILURE : EXIT_SUCCESS;
}
@@ -217,63 +215,4 @@ long_dbl (void)
return 0;
}
-/* Perform a few tests in a locale with thousands separators. */
-static int
-locale_test (void)
-{
- static const struct
- {
- const char *loc;
- const char *str;
- double exp;
- ptrdiff_t nread;
- } tests[] =
- {
- { "de_DE.UTF-8", "1,5", 1.5, 3 },
- { "de_DE.UTF-8", "1.5", 1.0, 1 },
- { "de_DE.UTF-8", "1.500", 1500.0, 5 },
- { "de_DE.UTF-8", "36.893.488.147.419.103.232", 0x1.0p65, 26 }
- };
-#define ntests (sizeof (tests) / sizeof (tests[0]))
- size_t n;
- int result = 0;
-
- puts ("\nLocale tests");
-
- for (n = 0; n < ntests; ++n)
- {
- double d;
- char *endp;
-
- if (setlocale (LC_ALL, tests[n].loc) == NULL)
- {
- printf ("cannot set locale %s\n", tests[n].loc);
- result = 1;
- continue;
- }
-
- /* We call __strtod_interal here instead of strtod to tests the
- handling of grouping. */
- d = __strtod_internal (tests[n].str, &endp, 1);
- if (d != tests[n].exp)
- {
- printf ("strtod(\"%s\") returns %g and not %g\n",
- tests[n].str, d, tests[n].exp);
- result = 1;
- }
- else if (endp - tests[n].str != tests[n].nread)
- {
- printf ("strtod(\"%s\") read %td bytes and not %td\n",
- tests[n].str, endp - tests[n].str, tests[n].nread);
- result = 1;
- }
- }
-
- if (result == 0)
- puts ("all OK");
-
- return result;
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
+#include <support/test-driver.c>
diff --git a/stdlib/tst-strtod1i.c b/stdlib/tst-strtod1i.c
new file mode 100644
index 0000000000..6f79425667
--- /dev/null
+++ b/stdlib/tst-strtod1i.c
@@ -0,0 +1,84 @@
+/* Basic tests for __strtod_internal.
+ Copyright (C) 1991-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ctype.h>
+#include <locale.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <math.h>
+
+/* Perform a few tests in a locale with thousands separators. */
+static int
+do_test (void)
+{
+ static const struct
+ {
+ const char *loc;
+ const char *str;
+ double exp;
+ ptrdiff_t nread;
+ } tests[] =
+ {
+ { "de_DE.UTF-8", "1,5", 1.5, 3 },
+ { "de_DE.UTF-8", "1.5", 1.0, 1 },
+ { "de_DE.UTF-8", "1.500", 1500.0, 5 },
+ { "de_DE.UTF-8", "36.893.488.147.419.103.232", 0x1.0p65, 26 }
+ };
+#define ntests (sizeof (tests) / sizeof (tests[0]))
+ size_t n;
+ int result = 0;
+
+ puts ("\nLocale tests");
+
+ for (n = 0; n < ntests; ++n)
+ {
+ double d;
+ char *endp;
+
+ if (setlocale (LC_ALL, tests[n].loc) == NULL)
+ {
+ printf ("cannot set locale %s\n", tests[n].loc);
+ result = 1;
+ continue;
+ }
+
+ d = __strtod_internal (tests[n].str, &endp, 1);
+ if (d != tests[n].exp)
+ {
+ printf ("strtod(\"%s\") returns %g and not %g\n",
+ tests[n].str, d, tests[n].exp);
+ result = 1;
+ }
+ else if (endp - tests[n].str != tests[n].nread)
+ {
+ printf ("strtod(\"%s\") read %td bytes and not %td\n",
+ tests[n].str, endp - tests[n].str, tests[n].nread);
+ result = 1;
+ }
+ }
+
+ if (result == 0)
+ puts ("all OK");
+
+ return result ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+
+#include <support/test-driver.c>
diff --git a/stdlib/tst-strtod5.c b/stdlib/tst-strtod5.c
index 337c746989..8976e39a58 100644
--- a/stdlib/tst-strtod5.c
+++ b/stdlib/tst-strtod5.c
@@ -1,3 +1,21 @@
+/* Tests of strtod in a locale using decimal comma.
+ Copyright (C) 2007-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
@@ -9,38 +27,27 @@
static const struct
{
const char *in;
- int group;
double expected;
} tests[] =
{
- { "0", 0, 0.0 },
- { "000", 0, 0.0 },
- { "-0", 0, -0.0 },
- { "-000", 0, -0.0 },
- { "0,", 0, 0.0 },
- { "-0,", 0, -0.0 },
- { "0,0", 0, 0.0 },
- { "-0,0", 0, -0.0 },
- { "0e-10", 0, 0.0 },
- { "-0e-10", 0, -0.0 },
- { "0,e-10", 0, 0.0 },
- { "-0,e-10", 0, -0.0 },
- { "0,0e-10", 0, 0.0 },
- { "-0,0e-10", 0, -0.0 },
- { "0e-1000000", 0, 0.0 },
- { "-0e-1000000", 0, -0.0 },
- { "0,0e-1000000", 0, 0.0 },
- { "-0,0e-1000000", 0, -0.0 },
- { "0", 1, 0.0 },
- { "000", 1, 0.0 },
- { "-0", 1, -0.0 },
- { "-000", 1, -0.0 },
- { "0e-10", 1, 0.0 },
- { "-0e-10", 1, -0.0 },
- { "0e-1000000", 1, 0.0 },
- { "-0e-1000000", 1, -0.0 },
- { "000"NBSP"000"NBSP"000", 1, 0.0 },
- { "-000"NBSP"000"NBSP"000", 1, -0.0 }
+ { "0", 0.0 },
+ { "000", 0.0 },
+ { "-0", -0.0 },
+ { "-000", -0.0 },
+ { "0,", 0.0 },
+ { "-0,", -0.0 },
+ { "0,0", 0.0 },
+ { "-0,0", -0.0 },
+ { "0e-10", 0.0 },
+ { "-0e-10", -0.0 },
+ { "0,e-10", 0.0 },
+ { "-0,e-10", -0.0 },
+ { "0,0e-10", 0.0 },
+ { "-0,0e-10", -0.0 },
+ { "0e-1000000", 0.0 },
+ { "-0e-1000000", -0.0 },
+ { "0,0e-1000000", 0.0 },
+ { "-0,0e-1000000", -0.0 },
};
#define NTESTS (sizeof (tests) / sizeof (tests[0]))
@@ -59,12 +66,7 @@ do_test (void)
for (int i = 0; i < NTESTS; ++i)
{
char *ep;
- double r;
-
- if (tests[i].group)
- r = __strtod_internal (tests[i].in, &ep, 1);
- else
- r = strtod (tests[i].in, &ep);
+ double r = strtod (tests[i].in, &ep);
if (*ep != '\0')
{
@@ -84,5 +86,4 @@ do_test (void)
return status;
}
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
+#include <support/test-driver.c>
diff --git a/stdlib/tst-strtod5i.c b/stdlib/tst-strtod5i.c
new file mode 100644
index 0000000000..7e319585bb
--- /dev/null
+++ b/stdlib/tst-strtod5i.c
@@ -0,0 +1,100 @@
+/* Tests of __strtod_internal in a locale using decimal comma.
+ Copyright (C) 2007-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#define NBSP "\xc2\xa0"
+
+static const struct
+{
+ const char *in;
+ int group;
+ double expected;
+} tests[] =
+ {
+ { "0", 0, 0.0 },
+ { "000", 0, 0.0 },
+ { "-0", 0, -0.0 },
+ { "-000", 0, -0.0 },
+ { "0,", 0, 0.0 },
+ { "-0,", 0, -0.0 },
+ { "0,0", 0, 0.0 },
+ { "-0,0", 0, -0.0 },
+ { "0e-10", 0, 0.0 },
+ { "-0e-10", 0, -0.0 },
+ { "0,e-10", 0, 0.0 },
+ { "-0,e-10", 0, -0.0 },
+ { "0,0e-10", 0, 0.0 },
+ { "-0,0e-10", 0, -0.0 },
+ { "0e-1000000", 0, 0.0 },
+ { "-0e-1000000", 0, -0.0 },
+ { "0,0e-1000000", 0, 0.0 },
+ { "-0,0e-1000000", 0, -0.0 },
+ { "0", 1, 0.0 },
+ { "000", 1, 0.0 },
+ { "-0", 1, -0.0 },
+ { "-000", 1, -0.0 },
+ { "0e-10", 1, 0.0 },
+ { "-0e-10", 1, -0.0 },
+ { "0e-1000000", 1, 0.0 },
+ { "-0e-1000000", 1, -0.0 },
+ { "000"NBSP"000"NBSP"000", 1, 0.0 },
+ { "-000"NBSP"000"NBSP"000", 1, -0.0 }
+ };
+#define NTESTS (sizeof (tests) / sizeof (tests[0]))
+
+
+static int
+do_test (void)
+{
+ if (setlocale (LC_ALL, "cs_CZ.UTF-8") == 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, tests[i].group);
+
+ if (*ep != '\0')
+ {
+ printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep);
+ status = 1;
+ }
+
+ if (r != tests[i].expected
+ || copysign (10.0, r) != copysign (10.0, tests[i].expected))
+ {
+ printf ("%d: got wrong results %g, expected %g\n",
+ i, r, tests[i].expected);
+ status = 1;
+ }
+ }
+
+ return status;
+}
+
+#include <support/test-driver.c>