@@ -31,6 +31,10 @@ | |||||
#include "json_tokener.h" | #include "json_tokener.h" | ||||
#include "json_util.h" | #include "json_util.h" | ||||
#ifdef HAVE_LOCALE_H | |||||
#include <locale.h> | |||||
#endif /* HAVE_LOCALE_H */ | |||||
#if !HAVE_STRDUP && defined(_MSC_VER) | #if !HAVE_STRDUP && defined(_MSC_VER) | ||||
/* MSC has the version as _strdup */ | /* MSC has the version as _strdup */ | ||||
# define strdup _strdup | # define strdup _strdup | ||||
@@ -227,6 +231,13 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | |||||
{ | { | ||||
struct json_object *obj = NULL; | struct json_object *obj = NULL; | ||||
char c = '\1'; | 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->char_offset = 0; | ||||
tok->err = json_tokener_success; | 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; | 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) | if (tok->err == json_tokener_success) | ||||
{ | { | ||||
json_object *ret = json_object_get(current); | json_object *ret = json_object_get(current); | ||||
@@ -36,10 +36,6 @@ | |||||
# include <unistd.h> | # include <unistd.h> | ||||
#endif /* HAVE_UNISTD_H */ | #endif /* HAVE_UNISTD_H */ | ||||
#ifdef HAVE_LOCALE_H | |||||
#include <locale.h> | |||||
#endif /* HAVE_LOCALE_H */ | |||||
#ifdef WIN32 | #ifdef WIN32 | ||||
# define WIN32_LEAN_AND_MEAN | # define WIN32_LEAN_AND_MEAN | ||||
# include <windows.h> | # include <windows.h> | ||||
@@ -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 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) | int json_parse_int64(const char *buf, int64_t *retval) | ||||
@@ -11,6 +11,7 @@ check_PROGRAMS += test_parse_int64 | |||||
check_PROGRAMS += test_null | check_PROGRAMS += test_null | ||||
check_PROGRAMS += test_cast | check_PROGRAMS += test_cast | ||||
check_PROGRAMS += test_parse | check_PROGRAMS += test_parse | ||||
check_PROGRAMS += test_locale | |||||
test1_LDADD = $(LIBJSON_LA) | test1_LDADD = $(LIBJSON_LA) | ||||
@@ -36,6 +37,8 @@ test_cast_LDADD = $(LIBJSON_LA) | |||||
test_parse_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 = test1.test test2.test test4.test testReplaceExisting.test parse_int64.test test_null.test test_cast.test test_parse.test | ||||
TESTS+= test_printbuf.test | TESTS+= test_printbuf.test | ||||
@@ -0,0 +1,30 @@ | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <stddef.h> | |||||
#include <string.h> | |||||
#include <assert.h> | |||||
#include "config.h" | |||||
#include "json.h" | |||||
#include "json_tokener.h" | |||||
#ifdef HAVE_LOCALE_H | |||||
#include <locale.h> | |||||
#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); | |||||
} | |||||