From a01b659ace168d85a3e9e47848eaaba2bea31078 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 13 Dec 2012 09:47:33 +0100 Subject: [PATCH] move locale change to be global for perf --- json_tokener.c | 16 ++++++++++++++++ json_util.c | 22 +--------------------- tests/Makefile.am | 3 +++ tests/test_locale.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 tests/test_locale.c diff --git a/json_tokener.c b/json_tokener.c index 85c530b..63bb41b 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -31,6 +31,10 @@ #include "json_tokener.h" #include "json_util.h" +#ifdef HAVE_LOCALE_H +#include +#endif /* HAVE_LOCALE_H */ + #if !HAVE_STRDUP && defined(_MSC_VER) /* MSC has the version as _strdup */ # define strdup _strdup @@ -227,6 +231,13 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, { struct json_object *obj = NULL; char c = '\1'; +#ifdef HAVE_SETLOCALE + char *oldlocale=NULL, *tmplocale; + + tmplocale = setlocale(LC_NUMERIC, NULL); + if (tmplocale) oldlocale = strdup(tmplocale); + setlocale(LC_NUMERIC, "C"); +#endif tok->char_offset = 0; tok->err = json_tokener_success; @@ -724,6 +735,11 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, tok->err = json_tokener_error_parse_eof; } +#ifdef HAVE_SETLOCALE + setlocale(LC_NUMERIC, oldlocale); + if (oldlocale) free(oldlocale); +#endif + if (tok->err == json_tokener_success) { json_object *ret = json_object_get(current); diff --git a/json_util.c b/json_util.c index c144059..0a59811 100644 --- a/json_util.c +++ b/json_util.c @@ -36,10 +36,6 @@ # include #endif /* HAVE_UNISTD_H */ -#ifdef HAVE_LOCALE_H -#include -#endif /* HAVE_LOCALE_H */ - #ifdef WIN32 # define WIN32_LEAN_AND_MEAN # include @@ -148,23 +144,7 @@ int json_object_to_file(char *filename, struct json_object *obj) int json_parse_double(const char *buf, double *retval) { - int ret; -#ifdef HAVE_SETLOCALE - char *old=NULL, *tmp; - - tmp = setlocale(LC_NUMERIC, NULL); - if (tmp) old = strdup(tmp); - setlocale(LC_NUMERIC, "C"); -#endif - - ret = sscanf(buf, "%lf", retval); - -#ifdef HAVE_SETLOCALE - setlocale(LC_NUMERIC, old); - if (old) free(old); -#endif - - return (ret==1 ? 0 : 1); + return (sscanf(buf, "%lf", retval)==1 ? 0 : 1); } int json_parse_int64(const char *buf, int64_t *retval) diff --git a/tests/Makefile.am b/tests/Makefile.am index 8057acd..90222ba 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -11,6 +11,7 @@ check_PROGRAMS += test_parse_int64 check_PROGRAMS += test_null check_PROGRAMS += test_cast check_PROGRAMS += test_parse +check_PROGRAMS += test_locale test1_LDADD = $(LIBJSON_LA) @@ -36,6 +37,8 @@ test_cast_LDADD = $(LIBJSON_LA) test_parse_LDADD = $(LIBJSON_LA) +test_locale_LDADD = $(LIBJSON_LA) + TESTS = test1.test test2.test test4.test testReplaceExisting.test parse_int64.test test_null.test test_cast.test test_parse.test TESTS+= test_printbuf.test diff --git a/tests/test_locale.c b/tests/test_locale.c new file mode 100644 index 0000000..6926a5d --- /dev/null +++ b/tests/test_locale.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include + +#include "config.h" +#include "json.h" +#include "json_tokener.h" + +#ifdef HAVE_LOCALE_H +#include +#endif /* HAVE_LOCALE_H */ + +int main(int argc, char **argv) +{ + json_object *new_obj; +#ifdef HAVE_SETLOCALE + setlocale(LC_NUMERIC, "de_DE"); +#else + printf("No locale\n"); +#endif + + MC_SET_DEBUG(1); + + new_obj = json_tokener_parse("[1.2,3.4,123456.78,5.0]"); + printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj)); + json_object_put(new_obj); +} + -- 2.7.4