From ca7a1973e25f131523b3923a32199e90f653161c Mon Sep 17 00:00:00 2001 From: Jan Gerhards Date: Sun, 27 Nov 2016 11:47:00 +0100 Subject: [PATCH 1/2] bugfix: floating point representaion without fractional part closes https://github.com/json-c/json-c/issues/278 --- json_object.c | 5 ++++- tests/test_parse.expected | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/json_object.c b/json_object.c index c65941ea32..139d8578a6 100644 --- a/json_object.c +++ b/json_object.c @@ -693,6 +693,7 @@ static int json_object_double_to_json_string_format(struct json_object* jso, { char buf[128], *p, *q; int size; + double dummy; /* needed for modf() */ /* Although JSON RFC does not support NaN or Infinity as numeric values ECMA 262 section 9.8.1 defines @@ -706,7 +707,9 @@ static int json_object_double_to_json_string_format(struct json_object* jso, size = snprintf(buf, sizeof(buf), "-Infinity"); else size = snprintf(buf, sizeof(buf), - format ? format : "%.17g", jso->o.c_double); + format ? format : + (modf(jso->o.c_double, &dummy) == 0) ? "%.17g.0" : "%.17g", + jso->o.c_double); p = strchr(buf, ','); if (p) { diff --git a/tests/test_parse.expected b/tests/test_parse.expected index 2158001186..713d318685 100644 --- a/tests/test_parse.expected +++ b/tests/test_parse.expected @@ -31,8 +31,8 @@ new_obj.to_string()={ "foo": "bar", "baz": null, "bool0": true } new_obj.to_string()={ "foo": [ null, "foo" ] } new_obj.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] } new_obj.to_string()={ "abc": "blue\nred\ngreen" } -new_obj.to_string()=[ 0 ] -new_obj.to_string()=[ 0 ] +new_obj.to_string()=[ 0.0 ] +new_obj.to_string()=[ 0.0 ] new_obj.to_string()=null new_obj.to_string()=[ 9223372036854775807 ] ================================== From 61db4cfac5e98d8eb227adbaa9fcfadbe7f9309d Mon Sep 17 00:00:00 2001 From: Jan Gerhards Date: Sun, 27 Nov 2016 11:50:48 +0100 Subject: [PATCH 2/2] testbench: add test for floating point representation --- tests/Makefile.am | 1 + tests/test_float.c | 24 ++++++++++++++++++++++++ tests/test_float.expected | 4 ++++ tests/test_float.test | 12 ++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 tests/test_float.c create mode 100644 tests/test_float.expected create mode 100755 tests/test_float.test diff --git a/tests/Makefile.am b/tests/Makefile.am index 3d01cad7b8..824ed30448 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -7,6 +7,7 @@ LIBJSON_LA=$(top_builddir)/libjson-c.la TESTS= TESTS+= test_util_file.test +TESTS+= test_float.test TESTS+= test1.test TESTS+= test2.test TESTS+= test4.test diff --git a/tests/test_float.c b/tests/test_float.c new file mode 100644 index 0000000000..a790cd48ce --- /dev/null +++ b/tests/test_float.c @@ -0,0 +1,24 @@ +/* Copyright (C) 2016 by Rainer Gerhards + * Released under ASL 2.0 */ +#include "config.h" +#include +#include "../json_object.h" +#include "../json_tokener.h" +int main(void) +{ + json_object *json; + + json = json_object_new_double(1.0); + printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); + json_object_put(json); + json = json_object_new_double(1.23); + printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); + json_object_put(json); + json = json_object_new_double(123456789.0); + printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); + json_object_put(json); + json = json_object_new_double(123456789.123); + printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); + json_object_put(json); + return 0; +} diff --git a/tests/test_float.expected b/tests/test_float.expected new file mode 100644 index 0000000000..970c6543ea --- /dev/null +++ b/tests/test_float.expected @@ -0,0 +1,4 @@ +json = 1.0 +json = 1.23 +json = 123456789.0 +json = 123456789.123 diff --git a/tests/test_float.test b/tests/test_float.test new file mode 100755 index 0000000000..8fb5d21fb5 --- /dev/null +++ b/tests/test_float.test @@ -0,0 +1,12 @@ +#!/bin/sh + +# Common definitions +if test -z "$srcdir"; then + srcdir="${0%/*}" + test "$srcdir" = "$0" && srcdir=. + test -z "$srcdir" && srcdir=. +fi +. "$srcdir/test-defs.sh" + +run_output_test test_float +exit $?