From fe2cd01e80d2d6f97ff9421ae56b29028edb9497 Mon Sep 17 00:00:00 2001 From: Matthias Loy Date: Thu, 14 Aug 2014 20:54:35 +0200 Subject: [PATCH 1/5] free does nothing if parameter equals NULL --- src/lib_json/json_value.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 637016f..30c1208 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -105,8 +105,7 @@ static inline char *duplicateStringValue(const char *value, /** Free the string duplicated by duplicateStringValue(). */ static inline void releaseStringValue(char *value) { - if (value) - free(value); + free(value); } } // namespace Json From 64d591b72005556ed3327ed1ad2b0e3532742c6c Mon Sep 17 00:00:00 2001 From: Matthias Loy Date: Thu, 14 Aug 2014 20:58:02 +0200 Subject: [PATCH 2/5] snprintf already calculated the length --- src/lib_json/json_writer.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index 76a3fb5..af5434e 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -74,15 +74,18 @@ std::string valueToString(double value) { #if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with // visual studio 2005 to // avoid warning. + size_t len; #if defined(WINCE) - _snprintf(buffer, sizeof(buffer), "%.16g", value); + len = _snprintf(buffer, sizeof(buffer), "%.16g", value); #else - sprintf_s(buffer, sizeof(buffer), "%.16g", value); + len = sprintf_s(buffer, sizeof(buffer), "%.16g", value); #endif + fixNumericLocale(buffer, buffer + len); #else if ( isfinite( value )) - { - snprintf(buffer, sizeof(buffer), "%.16g", value); + { + size_t len = snprintf(buffer, sizeof(buffer), "%.16g", value); + fixNumericLocale(buffer, buffer + len); } else { @@ -99,12 +102,8 @@ std::string valueToString(double value) { { snprintf(buffer, sizeof(buffer), "1e+9999"); } - // nothing more to do, return. - return buffer; } - #endif - fixNumericLocale(buffer, buffer + strlen(buffer)); return buffer; } From 8eb6f88a87704d312ff369d63e20ca9f3eccb2ad Mon Sep 17 00:00:00 2001 From: mloy Date: Tue, 19 Aug 2014 14:34:00 +0200 Subject: [PATCH 3/5] snprintf does return a signed integer assert if returned value is neagtive --- src/lib_json/json_writer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index af5434e..ab3979a 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -74,17 +74,19 @@ std::string valueToString(double value) { #if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with // visual studio 2005 to // avoid warning. - size_t len; + int len; #if defined(WINCE) len = _snprintf(buffer, sizeof(buffer), "%.16g", value); #else len = sprintf_s(buffer, sizeof(buffer), "%.16g", value); #endif + assert(len>=0); fixNumericLocale(buffer, buffer + len); #else if ( isfinite( value )) { - size_t len = snprintf(buffer, sizeof(buffer), "%.16g", value); + int len = snprintf(buffer, sizeof(buffer), "%.16g", value); + assert(len>=0); fixNumericLocale(buffer, buffer + len); } else From d94caac1ea5e40273651b757979837633e90f42a Mon Sep 17 00:00:00 2001 From: Christopher Dunn Date: Wed, 3 Sep 2014 13:46:37 -0700 Subject: [PATCH 4/5] ws --- src/lib_json/json_value.cpp | 2 +- src/lib_json/json_writer.cpp | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 30c1208..14cf618 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -105,7 +105,7 @@ static inline char *duplicateStringValue(const char *value, /** Free the string duplicated by duplicateStringValue(). */ static inline void releaseStringValue(char *value) { - free(value); + free(value); } } // namespace Json diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index ab3979a..d46d938 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -74,20 +74,20 @@ std::string valueToString(double value) { #if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with // visual studio 2005 to // avoid warning. - int len; + int len; #if defined(WINCE) - len = _snprintf(buffer, sizeof(buffer), "%.16g", value); + len = _snprintf(buffer, sizeof(buffer), "%.16g", value); #else - len = sprintf_s(buffer, sizeof(buffer), "%.16g", value); + len = sprintf_s(buffer, sizeof(buffer), "%.16g", value); #endif - assert(len>=0); - fixNumericLocale(buffer, buffer + len); + assert(len>=0); + fixNumericLocale(buffer, buffer + len); #else if ( isfinite( value )) - { - int len = snprintf(buffer, sizeof(buffer), "%.16g", value); - assert(len>=0); - fixNumericLocale(buffer, buffer + len); + { + int len = snprintf(buffer, sizeof(buffer), "%.16g", value); + assert(len>=0); + fixNumericLocale(buffer, buffer + len); } else { From 9d694516a06aefaa480036de73a43b2a47b78b77 Mon Sep 17 00:00:00 2001 From: Christopher Dunn Date: Wed, 3 Sep 2014 13:54:49 -0700 Subject: [PATCH 5/5] clarify return value --- src/lib_json/json_writer.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index d46d938..e52fe4a 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -67,6 +67,7 @@ std::string valueToString(double value) { // Allocate a buffer that is more than large enough to store the 16 digits of // precision requested below. char buffer[32]; + int len = -1; // Print into the buffer. We need not request the alternative representation // that always has a decimal point because JSON doesn't distingish the @@ -74,38 +75,36 @@ std::string valueToString(double value) { #if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with // visual studio 2005 to // avoid warning. - int len; #if defined(WINCE) len = _snprintf(buffer, sizeof(buffer), "%.16g", value); #else len = sprintf_s(buffer, sizeof(buffer), "%.16g", value); #endif - assert(len>=0); - fixNumericLocale(buffer, buffer + len); #else if ( isfinite( value )) { - int len = snprintf(buffer, sizeof(buffer), "%.16g", value); - assert(len>=0); - fixNumericLocale(buffer, buffer + len); + len = snprintf(buffer, sizeof(buffer), "%.16g", value); } else { // IEEE standard states that NaN values will not compare to themselves if ( value != value) { - snprintf(buffer, sizeof(buffer), "null"); + len = snprintf(buffer, sizeof(buffer), "null"); } else if ( value < 0) { - snprintf(buffer, sizeof(buffer), "-1e+9999"); + len = snprintf(buffer, sizeof(buffer), "-1e+9999"); } else { - snprintf(buffer, sizeof(buffer), "1e+9999"); + len = snprintf(buffer, sizeof(buffer), "1e+9999"); } + // For those, we do not need to call fixNumLoc, but it is fast. } #endif + assert(len>=0); + fixNumericLocale(buffer, buffer + len); return buffer; }