From: Eric Haszlakiewicz Date: Sun, 31 Jul 2016 18:39:56 +0000 (-0400) Subject: Issue #195: Actually call uselocale() in the new locale handling code in json_tokener. X-Git-Tag: json-c-0.13-20171207~142 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fa76e4a8c96c9678712534fd59cce8e8d9d98fa1;p=json-c Issue #195: Actually call uselocale() in the new locale handling code in json_tokener. Also, be sure the right locale_t is freed if we fail on the second uselocale. Finally, fix test_locale so it *doesn't* use json_object_to_json_string as that will simple re-emit the original parsed string values. --- diff --git a/json_tokener.c b/json_tokener.c index 233ac92..0c4007c 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -262,12 +262,16 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, // XXX at least Debian 8.4 has a bug in newlocale where it doesn't // change the decimal separator unless you set LC_TIME! if (newloc) - newloc = newlocale(LC_TIME, "C", newloc); + { + duploc = newloc; // original duploc has been freed by newlocale() + newloc = newlocale(LC_TIME, "C", duploc); + } if (newloc == NULL) { freelocale(duploc); return NULL; } + uselocale(newloc); } #elif defined(HAVE_SETLOCALE) { diff --git a/tests/test_locale.c b/tests/test_locale.c index e6d0956..f7f481c 100644 --- a/tests/test_locale.c +++ b/tests/test_locale.c @@ -30,13 +30,29 @@ int main(int argc, char **argv) MC_SET_DEBUG(1); new_obj = json_tokener_parse("[1.2,3.4,123456.78,5.0,2.3e10]"); - printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj)); - printf("new_obj.to_string()=%s\n", json_object_to_json_string_ext(new_obj,JSON_C_TO_STRING_NOZERO)); - json_object_put(new_obj); (void)snprintf(buf2, sizeof(buf2), "%f", 0.1); if (strcmp(buf1, buf2) != 0) printf("ERROR: Original locale not restored \"%s\" != \"%s\"", buf1, buf2); + +#ifdef HAVE_SETLOCALE + setlocale(LC_NUMERIC, "C"); +#endif + + // Explicitly print each value, to avoid having the "special" + // serialization done for parsed doubles simply re-emit the original + // string that was parsed. (see json_object_new_double_s()) + printf("new_obj.to_string()=["); + unsigned int ii; + for (ii = 0 ; ii < json_object_array_length(new_obj); ii++) + { + json_object *val = json_object_array_get_idx(new_obj, ii); + printf("%s%.2lf", (ii > 0) ? "," : "", json_object_get_double(val)); + } + printf("]\n"); + + printf("new_obj.to_string()=%s\n", json_object_to_json_string_ext(new_obj,JSON_C_TO_STRING_NOZERO)); + json_object_put(new_obj); } diff --git a/tests/test_locale.expected b/tests/test_locale.expected index 0068be4..3579ef1 100644 --- a/tests/test_locale.expected +++ b/tests/test_locale.expected @@ -1,2 +1,2 @@ -new_obj.to_string()=[ 1.2, 3.4, 123456.78, 5.0, 2.3e10 ] +new_obj.to_string()=[1.20,3.40,123456.78,5.00,23000000000.00] new_obj.to_string()=[1.2,3.4,123456.78,5.0,2.3e10]