]> granicus.if.org Git - json-c/commitdiff
Issue #195: Actually call uselocale() in the new locale handling code in json_tokener.
authorEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 31 Jul 2016 18:39:56 +0000 (14:39 -0400)
committerEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 31 Jul 2016 18:43:14 +0000 (14:43 -0400)
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.

json_tokener.c
tests/test_locale.c
tests/test_locale.expected

index 233ac92caf1ad8522ca28d7b6044d5ccf6f99812..0c4007c48ef9d6305c05b27daa8c741813542386 100644 (file)
@@ -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)
   {
index e6d09566d90989b5dc74fc50058fb6cff3608b01..f7f481c6c291e9d3f8e0d28ce000f22bb238f0ba 100644 (file)
@@ -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);
 }
 
index 0068be4aae143648702de95c3515eb267e355ffe..3579ef10341a403855316dfeef1f147936fb19a1 100644 (file)
@@ -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]