From d6dd604b551987b411ec8930c23bd5c9c93ef864 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 25 Apr 2013 00:04:02 -0300 Subject: util: rework safe_atod() to be locale-independent This adds some syntactic sugar with a macro RUN_WITH_LOCALE() that reset the thread-specific locale temporarily. --- src/test/test-util.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'src/test') diff --git a/src/test/test-util.c b/src/test/test-util.c index 83959c095..66a10ead4 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "util.h" @@ -145,13 +146,48 @@ static void test_safe_atolli(void) { static void test_safe_atod(void) { int r; double d; + char *e; + + r = safe_atod("junk", &d); + assert_se(r == -EINVAL); r = safe_atod("0.2244", &d); assert_se(r == 0); assert_se(abs(d - 0.2244) < 0.000001); - r = safe_atod("junk", &d); + r = safe_atod("0,5", &d); assert_se(r == -EINVAL); + + errno = 0; + strtod("0,5", &e); + assert_se(*e == ','); + + /* Check if this really is locale independent */ + setlocale(LC_NUMERIC, "de_DE.utf8"); + + r = safe_atod("0.2244", &d); + assert_se(r == 0); + assert_se(abs(d - 0.2244) < 0.000001); + + r = safe_atod("0,5", &d); + assert_se(r == -EINVAL); + + errno = 0; + assert_se(abs(strtod("0,5", &e) - 0.5) < 0.00001); + + /* And check again, reset */ + setlocale(LC_NUMERIC, "C"); + + r = safe_atod("0.2244", &d); + assert_se(r == 0); + assert_se(abs(d - 0.2244) < 0.000001); + + r = safe_atod("0,5", &d); + assert_se(r == -EINVAL); + + errno = 0; + strtod("0,5", &e); + assert_se(*e == ','); } static void test_strappend(void) { -- cgit v1.2.3