diff options
author | Bruno Haible <bruno@clisp.org> | 2019-02-01 03:12:28 +0100 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2019-02-01 03:12:28 +0100 |
commit | 97e23d40a659c85048b59852e1871823f727aeb2 (patch) | |
tree | 3af9ca8e63074de5b0b42826f24d18a4c5932dc5 /tests | |
parent | cd825c6d50babc1f4fbaccfee3fff1785fe23cc3 (diff) | |
download | gnulib-97e23d40a659c85048b59852e1871823f727aeb2.tar.gz |
strtod, strtold: Use the locale's decimal point.
* lib/strtod.c: Include <locale.h>, <stdio.h>, <langinfo.h>.
(decimal_point_char): New function, copied from lib/vasnprintf.c.
(parse_number): Add a radixchar argument. Use it instead of '.'.
(STRTOD): Invoke decimal_point_char and pass the result to parse_number.
* m4/strtod.m4 (gl_PREREQ_STRTOD): Test whether nl_langinfo exists.
* m4/strtold.m4 (gl_PREREQ_STRTOLD): Likewise.
* tests/test-strtod1.c: New file.
* tests/test-strtod1.sh: New file.
* modules/strtod-tests (Files): Add test-strtod1.{sh,c}. Add
locale-fr.m4 and its dependencies.
(configure.ac): Invoke gt_LOCALE_FR, gt_LOCALE_FR_UTF8.
(Makefile.am): Arrange to compile test-strtod1.c and run
test-strtod1.sh.
* tests/test-strtold1.c: New file.
* tests/test-strtold1.sh: New file.
* modules/strtold-tests (Files): Add test-strtold1.{sh,c}. Add
locale-fr.m4 and its dependencies.
(configure.ac): Invoke gt_LOCALE_FR, gt_LOCALE_FR_UTF8.
(Makefile.am): Arrange to compile test-strtold1.c and run
test-strtold1.sh.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test-strtod1.c | 97 | ||||
-rwxr-xr-x | tests/test-strtod1.sh | 23 | ||||
-rw-r--r-- | tests/test-strtold1.c | 97 | ||||
-rwxr-xr-x | tests/test-strtold1.sh | 23 |
4 files changed, 240 insertions, 0 deletions
diff --git a/tests/test-strtod1.c b/tests/test-strtod1.c new file mode 100644 index 0000000000..75200ccfea --- /dev/null +++ b/tests/test-strtod1.c @@ -0,0 +1,97 @@ +/* Test of strtod() in a French locale. + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +#include <config.h> + +#include <stdlib.h> + +#include <errno.h> +#include <locale.h> + +#include "macros.h" + +int +main (int argc, char *argv[]) +{ + /* Try to set the locale by implicitly looking at the LC_ALL environment + variable. + configure should already have checked that the locale is supported. */ + if (setlocale (LC_ALL, "") == NULL) + return 1; + + { + const char input[] = "1,"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 1.0); + ASSERT (ptr == input + 2); + ASSERT (errno == 0); + } + { + const char input[] = ",5"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 0.5); + ASSERT (ptr == input + 2); + ASSERT (errno == 0); + } + { + const char input[] = "1,5"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 1.5); + ASSERT (ptr == input + 3); + ASSERT (errno == 0); + } + { + const char input[] = "1.5"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 1.0); + ASSERT (ptr == input + 1); + ASSERT (errno == 0); + } + { + const char input[] = "123.456,789"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result == 123.0); + ASSERT (ptr == input + 3); + ASSERT (errno == 0); + } + { + const char input[] = "123,456.789"; + char *ptr; + double result; + errno = 0; + result = strtod (input, &ptr); + ASSERT (result > 123.45 && result < 123.46); + ASSERT (ptr == input + 7); + ASSERT (errno == 0); + } + + return 0; +} diff --git a/tests/test-strtod1.sh b/tests/test-strtod1.sh new file mode 100755 index 0000000000..d220f13a1b --- /dev/null +++ b/tests/test-strtod1.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +: ${LOCALE_FR=fr_FR} +: ${LOCALE_FR_UTF8=fr_FR.UTF-8} + +if test $LOCALE_FR = none && test $LOCALE_FR_UTF8 = none; then + if test -f /usr/bin/localedef; then + echo "Skipping test: no locale for testing is installed" + else + echo "Skipping test: no locale for testing is supported" + fi + exit 77 +fi + +if test $LOCALE_FR != none; then + LC_ALL=$LOCALE_FR ./test-strtod1${EXEEXT} || exit 1 +fi + +if test $LOCALE_FR_UTF8 != none; then + LC_ALL=$LOCALE_FR_UTF8 ./test-strtod1${EXEEXT} || exit 1 +fi + +exit 0 diff --git a/tests/test-strtold1.c b/tests/test-strtold1.c new file mode 100644 index 0000000000..3a2f533b35 --- /dev/null +++ b/tests/test-strtold1.c @@ -0,0 +1,97 @@ +/* Test of strtold() in a French locale. + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +#include <config.h> + +#include <stdlib.h> + +#include <errno.h> +#include <locale.h> + +#include "macros.h" + +int +main (int argc, char *argv[]) +{ + /* Try to set the locale by implicitly looking at the LC_ALL environment + variable. + configure should already have checked that the locale is supported. */ + if (setlocale (LC_ALL, "") == NULL) + return 1; + + { + const char input[] = "1,"; + char *ptr; + long double result; + errno = 0; + result = strtold (input, &ptr); + ASSERT (result == 1.0L); + ASSERT (ptr == input + 2); + ASSERT (errno == 0); + } + { + const char input[] = ",5"; + char *ptr; + long double result; + errno = 0; + result = strtold (input, &ptr); + ASSERT (result == 0.5L); + ASSERT (ptr == input + 2); + ASSERT (errno == 0); + } + { + const char input[] = "1,5"; + char *ptr; + long double result; + errno = 0; + result = strtold (input, &ptr); + ASSERT (result == 1.5L); + ASSERT (ptr == input + 3); + ASSERT (errno == 0); + } + { + const char input[] = "1.5"; + char *ptr; + long double result; + errno = 0; + result = strtold (input, &ptr); + ASSERT (result == 1.0L); + ASSERT (ptr == input + 1); + ASSERT (errno == 0); + } + { + const char input[] = "123.456,789"; + char *ptr; + long double result; + errno = 0; + result = strtold (input, &ptr); + ASSERT (result == 123.0L); + ASSERT (ptr == input + 3); + ASSERT (errno == 0); + } + { + const char input[] = "123,456.789"; + char *ptr; + long double result; + errno = 0; + result = strtold (input, &ptr); + ASSERT (result > 123.45L && result < 123.46L); + ASSERT (ptr == input + 7); + ASSERT (errno == 0); + } + + return 0; +} diff --git a/tests/test-strtold1.sh b/tests/test-strtold1.sh new file mode 100755 index 0000000000..edec4d3add --- /dev/null +++ b/tests/test-strtold1.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +: ${LOCALE_FR=fr_FR} +: ${LOCALE_FR_UTF8=fr_FR.UTF-8} + +if test $LOCALE_FR = none && test $LOCALE_FR_UTF8 = none; then + if test -f /usr/bin/localedef; then + echo "Skipping test: no locale for testing is installed" + else + echo "Skipping test: no locale for testing is supported" + fi + exit 77 +fi + +if test $LOCALE_FR != none; then + LC_ALL=$LOCALE_FR ./test-strtold1${EXEEXT} || exit 1 +fi + +if test $LOCALE_FR_UTF8 != none; then + LC_ALL=$LOCALE_FR_UTF8 ./test-strtold1${EXEEXT} || exit 1 +fi + +exit 0 |