summaryrefslogtreecommitdiffstats
path: root/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Utilities/cmjsoncpp/src/lib_json/json_writer.cpp')
-rw-r--r--Utilities/cmjsoncpp/src/lib_json/json_writer.cpp1420
1 files changed, 653 insertions, 767 deletions
diff --git a/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp b/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
index 803cfab..fc86505 100644
--- a/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
+++ b/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
@@ -1,115 +1,111 @@
// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors
// Distributed under MIT license, or public domain if desired and
// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at
-// http://jsoncpp.sourceforge.net/LICENSE
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
#if !defined(JSON_IS_AMALGAMATION)
-# include <json/writer.h>
-
-# include "json_tool.h"
+#include <json/writer.h>
+#include "json_tool.h"
#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <cassert>
-#include <cstdio>
-#include <cstring>
#include <iomanip>
#include <memory>
-#include <set>
#include <sstream>
#include <utility>
+#include <set>
+#include <cassert>
+#include <cstring>
+#include <cstdio>
-#if defined(_MSC_VER) && _MSC_VER >= 1200 && \
- _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0
-# include <float.h>
-# define isfinite _finite
-#elif defined(__sun) && defined(__SVR4) // Solaris
-# if !defined(isfinite)
-# include <ieeefp.h>
-# define isfinite finite
-# endif
+#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0
+#include <float.h>
+#define isfinite _finite
+#elif defined(__sun) && defined(__SVR4) //Solaris
+#if !defined(isfinite)
+#include <ieeefp.h>
+#define isfinite finite
+#endif
#elif defined(_AIX)
-# if !defined(isfinite)
-# include <math.h>
-# define isfinite finite
-# endif
+#if !defined(isfinite)
+#include <math.h>
+#define isfinite finite
+#endif
#elif defined(__hpux)
-# if !defined(isfinite) && !defined(__GNUC__)
-# if defined(__ia64) && !defined(finite)
-# define isfinite(x) \
- ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x)))
-# else
-# include <math.h>
-# define isfinite finite
-# endif
-# endif
+#if !defined(isfinite) && !defined(__GNUC__)
+#if defined(__ia64) && !defined(finite)
+#define isfinite(x) ((sizeof(x) == sizeof(float) ? \
+ _Isfinitef(x) : _IsFinite(x)))
#else
-# include <cmath>
-# if !(defined(__QNXNTO__)) // QNX already defines isfinite
-# define isfinite std::isfinite
-# endif
+#include <math.h>
+#define isfinite finite
+#endif
+#endif
+#else
+#include <cmath>
+#if !(defined(__QNXNTO__)) // QNX already defines isfinite
+#define isfinite std::isfinite
+#endif
#endif
#if defined(_MSC_VER)
-# if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && \
- _MSC_VER >= 1500 // VC++ 9.0 and above
-# define snprintf sprintf_s
-# elif _MSC_VER >= 1900 // VC++ 14.0 and above
-# define snprintf std::snprintf
-# else
-# define snprintf _snprintf
-# endif
+#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above
+#define snprintf sprintf_s
+#elif _MSC_VER >= 1900 // VC++ 14.0 and above
+#define snprintf std::snprintf
+#else
+#define snprintf _snprintf
+#endif
#elif defined(__ANDROID__) || defined(__QNXNTO__)
-# define snprintf snprintf
+#define snprintf snprintf
#elif __cplusplus >= 201103L
-# if !defined(__MINGW32__) && !defined(__CYGWIN__)
-# define snprintf std::snprintf
-# endif
+#if !defined(__MINGW32__) && !defined(__CYGWIN__)
+#define snprintf std::snprintf
+#endif
#endif
-#if defined(__BORLANDC__)
-# include <float.h>
-# define isfinite _finite
-# define snprintf _snprintf
+#if defined(__BORLANDC__)
+#include <float.h>
+#define isfinite _finite
+#define snprintf _snprintf
#endif
// Solaris
#if defined(__sun)
-# include <ieeefp.h>
-# if !defined(isfinite)
-# define isfinite finite
-# endif
+# include <ieeefp.h>
+# if !defined(isfinite)
+# define isfinite finite
+# endif
#endif
// AIX
#if defined(_AIX)
-# if !defined(isfinite)
-# define isfinite finite
-# endif
+# if !defined(isfinite)
+# define isfinite finite
+# endif
#endif
// HP-UX
#if defined(__hpux)
-# if !defined(isfinite)
-# if defined(__ia64) && !defined(finite) && !defined(__GNUC__)
-# define isfinite(x) \
- ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _Isfinite(x)))
-# else
-# include <math.h>
-# define isfinite finite
-# endif
+# if !defined(isfinite)
+# if defined(__ia64) && !defined(finite) && !defined(__GNUC__)
+# define isfinite(x) ((sizeof(x) == sizeof(float) ? \
+ _Isfinitef(x) : _Isfinite(x)))
+# else
+# include <math.h>
+# define isfinite finite
# endif
+# endif
#endif
// Ancient glibc
#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 2
-# if !defined(isfinite)
-# define isfinite __finite
-# endif
+# if !defined(isfinite)
+# define isfinite __finite
+# endif
#endif
#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0
// Disable warning about strdup being deprecated.
-# pragma warning(disable : 4996)
+#pragma warning(disable : 4996)
#endif
namespace Json {
@@ -117,11 +113,10 @@ namespace Json {
#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520)
typedef std::unique_ptr<StreamWriter> StreamWriterPtr;
#else
-typedef std::auto_ptr<StreamWriter> StreamWriterPtr;
+typedef std::auto_ptr<StreamWriter> StreamWriterPtr;
#endif
-static bool containsControlCharacter(const char* str)
-{
+static bool containsControlCharacter(const char* str) {
while (*str) {
if (isControlCharacter(*(str++)))
return true;
@@ -129,19 +124,17 @@ static bool containsControlCharacter(const char* str)
return false;
}
-static bool containsControlCharacter0(const char* str, unsigned len)
-{
+static bool containsControlCharacter0(const char* str, unsigned len) {
char const* end = str + len;
while (end != str) {
- if (isControlCharacter(*str) || 0 == *str)
+ if (isControlCharacter(*str) || 0==*str)
return true;
++str;
}
return false;
}
-JSONCPP_STRING valueToString(LargestInt value)
-{
+JSONCPP_STRING valueToString(LargestInt value) {
UIntToStringBuffer buffer;
char* current = buffer + sizeof(buffer);
if (value == Value::minLargestInt) {
@@ -157,8 +150,7 @@ JSONCPP_STRING valueToString(LargestInt value)
return current;
}
-JSONCPP_STRING valueToString(LargestUInt value)
-{
+JSONCPP_STRING valueToString(LargestUInt value) {
UIntToStringBuffer buffer;
char* current = buffer + sizeof(buffer);
uintToString(value, current);
@@ -168,22 +160,18 @@ JSONCPP_STRING valueToString(LargestUInt value)
#if defined(JSON_HAS_INT64)
-JSONCPP_STRING valueToString(Int value)
-{
+JSONCPP_STRING valueToString(Int value) {
return valueToString(LargestInt(value));
}
-JSONCPP_STRING valueToString(UInt value)
-{
+JSONCPP_STRING valueToString(UInt value) {
return valueToString(LargestUInt(value));
}
#endif // # if defined(JSON_HAS_INT64)
namespace {
-JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
- unsigned int precision)
-{
+JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int precision) {
// Allocate a buffer that is more than large enough to store the 16 digits of
// precision requested below.
char buffer[36];
@@ -199,8 +187,7 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
len = snprintf(buffer, sizeof(buffer), formatString, value);
fixNumericLocale(buffer, buffer + len);
- // try to ensure we preserve the fact that this was given to us as a double
- // on input
+ // try to ensure we preserve the fact that this was given to us as a double on input
if (!strchr(buffer, '.') && !strchr(buffer, 'e')) {
strcat(buffer, ".0");
}
@@ -208,14 +195,11 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
} else {
// IEEE standard states that NaN values will not compare to themselves
if (value != value) {
- len =
- snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null");
+ len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null");
} else if (value < 0) {
- len = snprintf(buffer, sizeof(buffer),
- useSpecialFloats ? "-Infinity" : "-1e+9999");
+ len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999");
} else {
- len = snprintf(buffer, sizeof(buffer),
- useSpecialFloats ? "Infinity" : "1e+9999");
+ len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "Infinity" : "1e+9999");
}
}
assert(len >= 0);
@@ -223,18 +207,11 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
}
}
-JSONCPP_STRING valueToString(double value)
-{
- return valueToString(value, false, 17);
-}
+JSONCPP_STRING valueToString(double value) { return valueToString(value, false, 17); }
-JSONCPP_STRING valueToString(bool value)
-{
- return value ? "true" : "false";
-}
+JSONCPP_STRING valueToString(bool value) { return value ? "true" : "false"; }
-JSONCPP_STRING valueToQuotedString(const char* value)
-{
+JSONCPP_STRING valueToQuotedString(const char* value) {
if (value == NULL)
return "";
// Not sure how to handle unicode...
@@ -245,50 +222,51 @@ JSONCPP_STRING valueToQuotedString(const char* value)
// Appending to JSONCPP_STRING is not efficient, but this should be rare.
// (Note: forward slashes are *not* rare, but I am not escaping them.)
JSONCPP_STRING::size_type maxsize =
- strlen(value) * 2 + 3; // allescaped+quotes+NULL
+ strlen(value) * 2 + 3; // allescaped+quotes+NULL
JSONCPP_STRING result;
result.reserve(maxsize); // to avoid lots of mallocs
result += "\"";
for (const char* c = value; *c != 0; ++c) {
switch (*c) {
- case '\"':
- result += "\\\"";
- break;
- case '\\':
- result += "\\\\";
- break;
- case '\b':
- result += "\\b";
- break;
- case '\f':
- result += "\\f";
- break;
- case '\n':
- result += "\\n";
- break;
- case '\r':
- result += "\\r";
- break;
- case '\t':
- result += "\\t";
- break;
- // case '/':
- // Even though \/ is considered a legal escape in JSON, a bare
- // slash is also legal, so I see no reason to escape it.
- // (I hope I am not misunderstanding something.
- // blep notes: actually escaping \/ may be useful in javascript to avoid
- // </ sequence. Should add a flag to allow this compatibility mode and
- // prevent this sequence from occurring.
- default:
- if (isControlCharacter(*c)) {
- JSONCPP_OSTRINGSTREAM oss;
- oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
- << std::setw(4) << static_cast<int>(*c);
- result += oss.str();
- } else {
- result += *c;
- }
- break;
+ case '\"':
+ result += "\\\"";
+ break;
+ case '\\':
+ result += "\\\\";
+ break;
+ case '\b':
+ result += "\\b";
+ break;
+ case '\f':
+ result += "\\f";
+ break;
+ case '\n':
+ result += "\\n";
+ break;
+ case '\r':
+ result += "\\r";
+ break;
+ case '\t':
+ result += "\\t";
+ break;
+ // case '/':
+ // Even though \/ is considered a legal escape in JSON, a bare
+ // slash is also legal, so I see no reason to escape it.
+ // (I hope I am not misunderstanding something.
+ // blep notes: actually escaping \/ may be useful in javascript to avoid </
+ // sequence.
+ // Should add a flag to allow this compatibility mode and prevent this
+ // sequence from occurring.
+ default:
+ if (isControlCharacter(*c)) {
+ JSONCPP_OSTRINGSTREAM oss;
+ oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
+ << std::setw(4) << static_cast<int>(*c);
+ result += oss.str();
+ } else {
+ result += *c;
+ }
+ break;
}
}
result += "\"";
@@ -296,8 +274,7 @@ JSONCPP_STRING valueToQuotedString(const char* value)
}
// https://github.com/upcaste/upcaste/blob/master/src/upcore/src/cstring/strnpbrk.cpp
-static char const* strnpbrk(char const* s, char const* accept, size_t n)
-{
+static char const* strnpbrk(char const* s, char const* accept, size_t n) {
assert((s || !n) && accept);
char const* const end = s + n;
@@ -311,8 +288,7 @@ static char const* strnpbrk(char const* s, char const* accept, size_t n)
}
return NULL;
}
-static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length)
-{
+static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) {
if (value == NULL)
return "";
// Not sure how to handle unicode...
@@ -322,51 +298,53 @@ static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length)
// We have to walk value and escape any special characters.
// Appending to JSONCPP_STRING is not efficient, but this should be rare.
// (Note: forward slashes are *not* rare, but I am not escaping them.)
- JSONCPP_STRING::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL
+ JSONCPP_STRING::size_type maxsize =
+ length * 2 + 3; // allescaped+quotes+NULL
JSONCPP_STRING result;
result.reserve(maxsize); // to avoid lots of mallocs
result += "\"";
char const* end = value + length;
for (const char* c = value; c != end; ++c) {
switch (*c) {
- case '\"':
- result += "\\\"";
- break;
- case '\\':
- result += "\\\\";
- break;
- case '\b':
- result += "\\b";
- break;
- case '\f':
- result += "\\f";
- break;
- case '\n':
- result += "\\n";
- break;
- case '\r':
- result += "\\r";
- break;
- case '\t':
- result += "\\t";
- break;
- // case '/':
- // Even though \/ is considered a legal escape in JSON, a bare
- // slash is also legal, so I see no reason to escape it.
- // (I hope I am not misunderstanding something.)
- // blep notes: actually escaping \/ may be useful in javascript to avoid
- // </ sequence. Should add a flag to allow this compatibility mode and
- // prevent this sequence from occurring.
- default:
- if ((isControlCharacter(*c)) || (*c == 0)) {
- JSONCPP_OSTRINGSTREAM oss;
- oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
- << std::setw(4) << static_cast<int>(*c);
- result += oss.str();
- } else {
- result += *c;
- }
- break;
+ case '\"':
+ result += "\\\"";
+ break;
+ case '\\':
+ result += "\\\\";
+ break;
+ case '\b':
+ result += "\\b";
+ break;
+ case '\f':
+ result += "\\f";
+ break;
+ case '\n':
+ result += "\\n";
+ break;
+ case '\r':
+ result += "\\r";
+ break;
+ case '\t':
+ result += "\\t";
+ break;
+ // case '/':
+ // Even though \/ is considered a legal escape in JSON, a bare
+ // slash is also legal, so I see no reason to escape it.
+ // (I hope I am not misunderstanding something.)
+ // blep notes: actually escaping \/ may be useful in javascript to avoid </
+ // sequence.
+ // Should add a flag to allow this compatibility mode and prevent this
+ // sequence from occurring.
+ default:
+ if ((isControlCharacter(*c)) || (*c == 0)) {
+ JSONCPP_OSTRINGSTREAM oss;
+ oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
+ << std::setw(4) << static_cast<int>(*c);
+ result += oss.str();
+ } else {
+ result += *c;
+ }
+ break;
}
}
result += "\"";
@@ -375,98 +353,80 @@ static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length)
// Class Writer
// //////////////////////////////////////////////////////////////////
-Writer::~Writer()
-{
-}
+Writer::~Writer() {}
// Class FastWriter
// //////////////////////////////////////////////////////////////////
FastWriter::FastWriter()
- : yamlCompatiblityEnabled_(false)
- , dropNullPlaceholders_(false)
- , omitEndingLineFeed_(false)
-{
-}
+ : yamlCompatiblityEnabled_(false), dropNullPlaceholders_(false),
+ omitEndingLineFeed_(false) {}
-void FastWriter::enableYAMLCompatibility()
-{
- this->yamlCompatiblityEnabled_ = true;
-}
+void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; }
-void FastWriter::dropNullPlaceholders()
-{
- this->dropNullPlaceholders_ = true;
-}
+void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; }
-void FastWriter::omitEndingLineFeed()
-{
- this->omitEndingLineFeed_ = true;
-}
+void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; }
-JSONCPP_STRING FastWriter::write(const Value& root)
-{
- this->document_.clear();
- this->writeValue(root);
- if (!this->omitEndingLineFeed_)
- this->document_ += "\n";
- return this->document_;
+JSONCPP_STRING FastWriter::write(const Value& root) {
+ document_.clear();
+ writeValue(root);
+ if (!omitEndingLineFeed_)
+ document_ += "\n";
+ return document_;
}
-void FastWriter::writeValue(const Value& value)
-{
+void FastWriter::writeValue(const Value& value) {
switch (value.type()) {
- case nullValue:
- if (!this->dropNullPlaceholders_)
- this->document_ += "null";
- break;
- case intValue:
- this->document_ += valueToString(value.asLargestInt());
- break;
- case uintValue:
- this->document_ += valueToString(value.asLargestUInt());
- break;
- case realValue:
- this->document_ += valueToString(value.asDouble());
- break;
- case stringValue: {
- // Is NULL possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->document_ +=
- valueToQuotedStringN(str, static_cast<unsigned>(end - str));
- break;
+ case nullValue:
+ if (!dropNullPlaceholders_)
+ document_ += "null";
+ break;
+ case intValue:
+ document_ += valueToString(value.asLargestInt());
+ break;
+ case uintValue:
+ document_ += valueToString(value.asLargestUInt());
+ break;
+ case realValue:
+ document_ += valueToString(value.asDouble());
+ break;
+ case stringValue:
+ {
+ // Is NULL possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) document_ += valueToQuotedStringN(str, static_cast<unsigned>(end-str));
+ break;
+ }
+ case booleanValue:
+ document_ += valueToString(value.asBool());
+ break;
+ case arrayValue: {
+ document_ += '[';
+ ArrayIndex size = value.size();
+ for (ArrayIndex index = 0; index < size; ++index) {
+ if (index > 0)
+ document_ += ',';
+ writeValue(value[index]);
}
- case booleanValue:
- this->document_ += valueToString(value.asBool());
- break;
- case arrayValue: {
- this->document_ += '[';
- ArrayIndex size = value.size();
- for (ArrayIndex index = 0; index < size; ++index) {
- if (index > 0)
- this->document_ += ',';
- this->writeValue(value[index]);
- }
- this->document_ += ']';
- } break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- this->document_ += '{';
- for (Value::Members::iterator it = members.begin(); it != members.end();
- ++it) {
- const JSONCPP_STRING& name = *it;
- if (it != members.begin())
- this->document_ += ',';
- this->document_ += valueToQuotedStringN(
- name.data(), static_cast<unsigned>(name.length()));
- this->document_ += this->yamlCompatiblityEnabled_ ? ": " : ":";
- this->writeValue(value[name]);
- }
- this->document_ += '}';
- } break;
+ document_ += ']';
+ } break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ document_ += '{';
+ for (Value::Members::iterator it = members.begin(); it != members.end();
+ ++it) {
+ const JSONCPP_STRING& name = *it;
+ if (it != members.begin())
+ document_ += ',';
+ document_ += valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length()));
+ document_ += yamlCompatiblityEnabled_ ? ": " : ":";
+ writeValue(value[name]);
+ }
+ document_ += '}';
+ } break;
}
}
@@ -474,498 +434,454 @@ void FastWriter::writeValue(const Value& value)
// //////////////////////////////////////////////////////////////////
StyledWriter::StyledWriter()
- : rightMargin_(74)
- , indentSize_(3)
- , addChildValues_()
-{
-}
+ : rightMargin_(74), indentSize_(3), addChildValues_() {}
-JSONCPP_STRING StyledWriter::write(const Value& root)
-{
- this->document_.clear();
- this->addChildValues_ = false;
- this->indentString_.clear();
- this->writeCommentBeforeValue(root);
- this->writeValue(root);
- this->writeCommentAfterValueOnSameLine(root);
- this->document_ += "\n";
- return this->document_;
+JSONCPP_STRING StyledWriter::write(const Value& root) {
+ document_.clear();
+ addChildValues_ = false;
+ indentString_.clear();
+ writeCommentBeforeValue(root);
+ writeValue(root);
+ writeCommentAfterValueOnSameLine(root);
+ document_ += "\n";
+ return document_;
}
-void StyledWriter::writeValue(const Value& value)
-{
+void StyledWriter::writeValue(const Value& value) {
switch (value.type()) {
- case nullValue:
- this->pushValue("null");
- break;
- case intValue:
- this->pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- this->pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- this->pushValue(valueToString(value.asDouble()));
- break;
- case stringValue: {
- // Is NULL possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->pushValue(
- valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
- else
- this->pushValue("");
- break;
- }
- case booleanValue:
- this->pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- this->writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- this->pushValue("{}");
- else {
- this->writeWithIndent("{");
- this->indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- const JSONCPP_STRING& name = *it;
- const Value& childValue = value[name];
- this->writeCommentBeforeValue(childValue);
- this->writeWithIndent(valueToQuotedString(name.c_str()));
- this->document_ += " : ";
- this->writeValue(childValue);
- if (++it == members.end()) {
- this->writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- this->document_ += ',';
- this->writeCommentAfterValueOnSameLine(childValue);
+ case nullValue:
+ pushValue("null");
+ break;
+ case intValue:
+ pushValue(valueToString(value.asLargestInt()));
+ break;
+ case uintValue:
+ pushValue(valueToString(value.asLargestUInt()));
+ break;
+ case realValue:
+ pushValue(valueToString(value.asDouble()));
+ break;
+ case stringValue:
+ {
+ // Is NULL possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
+ else pushValue("");
+ break;
+ }
+ case booleanValue:
+ pushValue(valueToString(value.asBool()));
+ break;
+ case arrayValue:
+ writeArrayValue(value);
+ break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ if (members.empty())
+ pushValue("{}");
+ else {
+ writeWithIndent("{");
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;) {
+ const JSONCPP_STRING& name = *it;
+ const Value& childValue = value[name];
+ writeCommentBeforeValue(childValue);
+ writeWithIndent(valueToQuotedString(name.c_str()));
+ document_ += " : ";
+ writeValue(childValue);
+ if (++it == members.end()) {
+ writeCommentAfterValueOnSameLine(childValue);
+ break;
}
- this->unindent();
- this->writeWithIndent("}");
+ document_ += ',';
+ writeCommentAfterValueOnSameLine(childValue);
}
- } break;
+ unindent();
+ writeWithIndent("}");
+ }
+ } break;
}
}
-void StyledWriter::writeArrayValue(const Value& value)
-{
+void StyledWriter::writeArrayValue(const Value& value) {
unsigned size = value.size();
if (size == 0)
- this->pushValue("[]");
+ pushValue("[]");
else {
- bool isArrayMultiLine = this->isMultineArray(value);
+ bool isArrayMultiLine = isMultineArray(value);
if (isArrayMultiLine) {
- this->writeWithIndent("[");
- this->indent();
- bool hasChildValue = !this->childValues_.empty();
+ writeWithIndent("[");
+ indent();
+ bool hasChildValue = !childValues_.empty();
unsigned index = 0;
for (;;) {
const Value& childValue = value[index];
- this->writeCommentBeforeValue(childValue);
+ writeCommentBeforeValue(childValue);
if (hasChildValue)
- this->writeWithIndent(this->childValues_[index]);
+ writeWithIndent(childValues_[index]);
else {
- this->writeIndent();
- this->writeValue(childValue);
+ writeIndent();
+ writeValue(childValue);
}
if (++index == size) {
- this->writeCommentAfterValueOnSameLine(childValue);
+ writeCommentAfterValueOnSameLine(childValue);
break;
}
- this->document_ += ',';
- this->writeCommentAfterValueOnSameLine(childValue);
+ document_ += ',';
+ writeCommentAfterValueOnSameLine(childValue);
}
- this->unindent();
- this->writeWithIndent("]");
+ unindent();
+ writeWithIndent("]");
} else // output on a single line
{
- assert(this->childValues_.size() == size);
- this->document_ += "[ ";
+ assert(childValues_.size() == size);
+ document_ += "[ ";
for (unsigned index = 0; index < size; ++index) {
if (index > 0)
- this->document_ += ", ";
- this->document_ += this->childValues_[index];
+ document_ += ", ";
+ document_ += childValues_[index];
}
- this->document_ += " ]";
+ document_ += " ]";
}
}
}
-bool StyledWriter::isMultineArray(const Value& value)
-{
+bool StyledWriter::isMultineArray(const Value& value) {
ArrayIndex const size = value.size();
- bool isMultiLine = size * 3 >= this->rightMargin_;
- this->childValues_.clear();
+ bool isMultiLine = size * 3 >= rightMargin_;
+ childValues_.clear();
for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) {
const Value& childValue = value[index];
isMultiLine = ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
+ childValue.size() > 0);
}
if (!isMultiLine) // check if line length > max line length
{
- this->childValues_.reserve(size);
- this->addChildValues_ = true;
+ childValues_.reserve(size);
+ addChildValues_ = true;
ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
for (ArrayIndex index = 0; index < size; ++index) {
- if (this->hasCommentForValue(value[index])) {
+ if (hasCommentForValue(value[index])) {
isMultiLine = true;
}
- this->writeValue(value[index]);
- lineLength +=
- static_cast<ArrayIndex>(this->childValues_[index].length());
+ writeValue(value[index]);
+ lineLength += static_cast<ArrayIndex>(childValues_[index].length());
}
- this->addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= this->rightMargin_;
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
}
return isMultiLine;
}
-void StyledWriter::pushValue(const JSONCPP_STRING& value)
-{
- if (this->addChildValues_)
- this->childValues_.push_back(value);
+void StyledWriter::pushValue(const JSONCPP_STRING& value) {
+ if (addChildValues_)
+ childValues_.push_back(value);
else
- this->document_ += value;
+ document_ += value;
}
-void StyledWriter::writeIndent()
-{
- if (!this->document_.empty()) {
- char last = this->document_[this->document_.length() - 1];
+void StyledWriter::writeIndent() {
+ if (!document_.empty()) {
+ char last = document_[document_.length() - 1];
if (last == ' ') // already indented
return;
if (last != '\n') // Comments may add new-line
- this->document_ += '\n';
+ document_ += '\n';
}
- this->document_ += this->indentString_;
+ document_ += indentString_;
}
-void StyledWriter::writeWithIndent(const JSONCPP_STRING& value)
-{
- this->writeIndent();
- this->document_ += value;
+void StyledWriter::writeWithIndent(const JSONCPP_STRING& value) {
+ writeIndent();
+ document_ += value;
}
-void StyledWriter::indent()
-{
- this->indentString_ += JSONCPP_STRING(this->indentSize_, ' ');
-}
+void StyledWriter::indent() { indentString_ += JSONCPP_STRING(indentSize_, ' '); }
-void StyledWriter::unindent()
-{
- assert(this->indentString_.size() >= this->indentSize_);
- this->indentString_.resize(this->indentString_.size() - this->indentSize_);
+void StyledWriter::unindent() {
+ assert(indentString_.size() >= indentSize_);
+ indentString_.resize(indentString_.size() - indentSize_);
}
-void StyledWriter::writeCommentBeforeValue(const Value& root)
-{
+void StyledWriter::writeCommentBeforeValue(const Value& root) {
if (!root.hasComment(commentBefore))
return;
- this->document_ += "\n";
- this->writeIndent();
+ document_ += "\n";
+ writeIndent();
const JSONCPP_STRING& comment = root.getComment(commentBefore);
JSONCPP_STRING::const_iterator iter = comment.begin();
while (iter != comment.end()) {
- this->document_ += *iter;
- if (*iter == '\n' && (iter != comment.end() && *(iter + 1) == '/'))
- this->writeIndent();
+ document_ += *iter;
+ if (*iter == '\n' &&
+ (iter != comment.end() && *(iter + 1) == '/'))
+ writeIndent();
++iter;
}
// Comments are stripped of trailing newlines, so add one here
- this->document_ += "\n";
+ document_ += "\n";
}
-void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root)
-{
+void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) {
if (root.hasComment(commentAfterOnSameLine))
- this->document_ += " " + root.getComment(commentAfterOnSameLine);
+ document_ += " " + root.getComment(commentAfterOnSameLine);
if (root.hasComment(commentAfter)) {
- this->document_ += "\n";
- this->document_ += root.getComment(commentAfter);
- this->document_ += "\n";
+ document_ += "\n";
+ document_ += root.getComment(commentAfter);
+ document_ += "\n";
}
}
-bool StyledWriter::hasCommentForValue(const Value& value)
-{
+bool StyledWriter::hasCommentForValue(const Value& value) {
return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) || value.hasComment(commentAfter);
+ value.hasComment(commentAfterOnSameLine) ||
+ value.hasComment(commentAfter);
}
// Class StyledStreamWriter
// //////////////////////////////////////////////////////////////////
StyledStreamWriter::StyledStreamWriter(JSONCPP_STRING indentation)
- : document_(NULL)
- , rightMargin_(74)
- , indentation_(indentation)
- , addChildValues_()
-{
-}
-
-void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root)
-{
- this->document_ = &out;
- this->addChildValues_ = false;
- this->indentString_.clear();
- this->indented_ = true;
- this->writeCommentBeforeValue(root);
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(root);
- this->writeCommentAfterValueOnSameLine(root);
- *this->document_ << "\n";
- this->document_ = NULL; // Forget the stream, for safety.
-}
-
-void StyledStreamWriter::writeValue(const Value& value)
-{
+ : document_(NULL), rightMargin_(74), indentation_(indentation),
+ addChildValues_() {}
+
+void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root) {
+ document_ = &out;
+ addChildValues_ = false;
+ indentString_.clear();
+ indented_ = true;
+ writeCommentBeforeValue(root);
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(root);
+ writeCommentAfterValueOnSameLine(root);
+ *document_ << "\n";
+ document_ = NULL; // Forget the stream, for safety.
+}
+
+void StyledStreamWriter::writeValue(const Value& value) {
switch (value.type()) {
- case nullValue:
- this->pushValue("null");
- break;
- case intValue:
- this->pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- this->pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- this->pushValue(valueToString(value.asDouble()));
- break;
- case stringValue: {
- // Is NULL possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->pushValue(
- valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
- else
- this->pushValue("");
- break;
- }
- case booleanValue:
- this->pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- this->writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- this->pushValue("{}");
- else {
- this->writeWithIndent("{");
- this->indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- const JSONCPP_STRING& name = *it;
- const Value& childValue = value[name];
- this->writeCommentBeforeValue(childValue);
- this->writeWithIndent(valueToQuotedString(name.c_str()));
- *this->document_ << " : ";
- this->writeValue(childValue);
- if (++it == members.end()) {
- this->writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *this->document_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ case nullValue:
+ pushValue("null");
+ break;
+ case intValue:
+ pushValue(valueToString(value.asLargestInt()));
+ break;
+ case uintValue:
+ pushValue(valueToString(value.asLargestUInt()));
+ break;
+ case realValue:
+ pushValue(valueToString(value.asDouble()));
+ break;
+ case stringValue:
+ {
+ // Is NULL possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
+ else pushValue("");
+ break;
+ }
+ case booleanValue:
+ pushValue(valueToString(value.asBool()));
+ break;
+ case arrayValue:
+ writeArrayValue(value);
+ break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ if (members.empty())
+ pushValue("{}");
+ else {
+ writeWithIndent("{");
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;) {
+ const JSONCPP_STRING& name = *it;
+ const Value& childValue = value[name];
+ writeCommentBeforeValue(childValue);
+ writeWithIndent(valueToQuotedString(name.c_str()));
+ *document_ << " : ";
+ writeValue(childValue);
+ if (++it == members.end()) {
+ writeCommentAfterValueOnSameLine(childValue);
+ break;
}
- this->unindent();
- this->writeWithIndent("}");
+ *document_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- } break;
+ unindent();
+ writeWithIndent("}");
+ }
+ } break;
}
}
-void StyledStreamWriter::writeArrayValue(const Value& value)
-{
+void StyledStreamWriter::writeArrayValue(const Value& value) {
unsigned size = value.size();
if (size == 0)
- this->pushValue("[]");
+ pushValue("[]");
else {
- bool isArrayMultiLine = this->isMultineArray(value);
+ bool isArrayMultiLine = isMultineArray(value);
if (isArrayMultiLine) {
- this->writeWithIndent("[");
- this->indent();
- bool hasChildValue = !this->childValues_.empty();
+ writeWithIndent("[");
+ indent();
+ bool hasChildValue = !childValues_.empty();
unsigned index = 0;
for (;;) {
const Value& childValue = value[index];
- this->writeCommentBeforeValue(childValue);
+ writeCommentBeforeValue(childValue);
if (hasChildValue)
- this->writeWithIndent(this->childValues_[index]);
+ writeWithIndent(childValues_[index]);
else {
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(childValue);
- this->indented_ = false;
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(childValue);
+ indented_ = false;
}
if (++index == size) {
- this->writeCommentAfterValueOnSameLine(childValue);
+ writeCommentAfterValueOnSameLine(childValue);
break;
}
- *this->document_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ *document_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- this->unindent();
- this->writeWithIndent("]");
+ unindent();
+ writeWithIndent("]");
} else // output on a single line
{
- assert(this->childValues_.size() == size);
- *this->document_ << "[ ";
+ assert(childValues_.size() == size);
+ *document_ << "[ ";
for (unsigned index = 0; index < size; ++index) {
if (index > 0)
- *this->document_ << ", ";
- *this->document_ << this->childValues_[index];
+ *document_ << ", ";
+ *document_ << childValues_[index];
}
- *this->document_ << " ]";
+ *document_ << " ]";
}
}
}
-bool StyledStreamWriter::isMultineArray(const Value& value)
-{
+bool StyledStreamWriter::isMultineArray(const Value& value) {
ArrayIndex const size = value.size();
- bool isMultiLine = size * 3 >= this->rightMargin_;
- this->childValues_.clear();
+ bool isMultiLine = size * 3 >= rightMargin_;
+ childValues_.clear();
for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) {
const Value& childValue = value[index];
isMultiLine = ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
+ childValue.size() > 0);
}
if (!isMultiLine) // check if line length > max line length
{
- this->childValues_.reserve(size);
- this->addChildValues_ = true;
+ childValues_.reserve(size);
+ addChildValues_ = true;
ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
for (ArrayIndex index = 0; index < size; ++index) {
- if (this->hasCommentForValue(value[index])) {
+ if (hasCommentForValue(value[index])) {
isMultiLine = true;
}
- this->writeValue(value[index]);
- lineLength +=
- static_cast<ArrayIndex>(this->childValues_[index].length());
+ writeValue(value[index]);
+ lineLength += static_cast<ArrayIndex>(childValues_[index].length());
}
- this->addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= this->rightMargin_;
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
}
return isMultiLine;
}
-void StyledStreamWriter::pushValue(const JSONCPP_STRING& value)
-{
- if (this->addChildValues_)
- this->childValues_.push_back(value);
+void StyledStreamWriter::pushValue(const JSONCPP_STRING& value) {
+ if (addChildValues_)
+ childValues_.push_back(value);
else
- *this->document_ << value;
+ *document_ << value;
}
-void StyledStreamWriter::writeIndent()
-{
+void StyledStreamWriter::writeIndent() {
// blep intended this to look at the so-far-written string
// to determine whether we are already indented, but
// with a stream we cannot do that. So we rely on some saved state.
// The caller checks indented_.
- *this->document_ << '\n' << this->indentString_;
+ *document_ << '\n' << indentString_;
}
-void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value)
-{
- if (!this->indented_)
- this->writeIndent();
- *this->document_ << value;
- this->indented_ = false;
+void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value) {
+ if (!indented_) writeIndent();
+ *document_ << value;
+ indented_ = false;
}
-void StyledStreamWriter::indent()
-{
- this->indentString_ += this->indentation_;
-}
+void StyledStreamWriter::indent() { indentString_ += indentation_; }
-void StyledStreamWriter::unindent()
-{
- assert(this->indentString_.size() >= this->indentation_.size());
- this->indentString_.resize(this->indentString_.size() -
- this->indentation_.size());
+void StyledStreamWriter::unindent() {
+ assert(indentString_.size() >= indentation_.size());
+ indentString_.resize(indentString_.size() - indentation_.size());
}
-void StyledStreamWriter::writeCommentBeforeValue(const Value& root)
-{
+void StyledStreamWriter::writeCommentBeforeValue(const Value& root) {
if (!root.hasComment(commentBefore))
return;
- if (!this->indented_)
- this->writeIndent();
+ if (!indented_) writeIndent();
const JSONCPP_STRING& comment = root.getComment(commentBefore);
JSONCPP_STRING::const_iterator iter = comment.begin();
while (iter != comment.end()) {
- *this->document_ << *iter;
- if (*iter == '\n' && (iter != comment.end() && *(iter + 1) == '/'))
+ *document_ << *iter;
+ if (*iter == '\n' &&
+ (iter != comment.end() && *(iter + 1) == '/'))
// writeIndent(); // would include newline
- *this->document_ << this->indentString_;
+ *document_ << indentString_;
++iter;
}
- this->indented_ = false;
+ indented_ = false;
}
-void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root)
-{
+void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) {
if (root.hasComment(commentAfterOnSameLine))
- *this->document_ << ' ' << root.getComment(commentAfterOnSameLine);
+ *document_ << ' ' << root.getComment(commentAfterOnSameLine);
if (root.hasComment(commentAfter)) {
- this->writeIndent();
- *this->document_ << root.getComment(commentAfter);
+ writeIndent();
+ *document_ << root.getComment(commentAfter);
}
- this->indented_ = false;
+ indented_ = false;
}
-bool StyledStreamWriter::hasCommentForValue(const Value& value)
-{
+bool StyledStreamWriter::hasCommentForValue(const Value& value) {
return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) || value.hasComment(commentAfter);
+ value.hasComment(commentAfterOnSameLine) ||
+ value.hasComment(commentAfter);
}
//////////////////////////
// BuiltStyledStreamWriter
/// Scoped enums are not available until C++11.
-struct CommentStyle
-{
+struct CommentStyle {
/// Decide whether to write comments.
- enum Enum
- {
- None, ///< Drop all comments.
- Most, ///< Recover odd behavior of previous versions (not implemented yet).
- All ///< Keep all comments.
+ enum Enum {
+ None, ///< Drop all comments.
+ Most, ///< Recover odd behavior of previous versions (not implemented yet).
+ All ///< Keep all comments.
};
};
struct BuiltStyledStreamWriter : public StreamWriter
{
- BuiltStyledStreamWriter(JSONCPP_STRING const& indentation,
- CommentStyle::Enum cs,
- JSONCPP_STRING const& colonSymbol,
- JSONCPP_STRING const& nullSymbol,
- JSONCPP_STRING const& endingLineFeedSymbol,
- bool useSpecialFloats, unsigned int precision);
+ BuiltStyledStreamWriter(
+ JSONCPP_STRING const& indentation,
+ CommentStyle::Enum cs,
+ JSONCPP_STRING const& colonSymbol,
+ JSONCPP_STRING const& nullSymbol,
+ JSONCPP_STRING const& endingLineFeedSymbol,
+ bool useSpecialFloats,
+ unsigned int precision);
int write(Value const& root, JSONCPP_OSTREAM* sout) JSONCPP_OVERRIDE;
-
private:
void writeValue(Value const& value);
void writeArrayValue(Value const& value);
@@ -995,10 +911,13 @@ private:
unsigned int precision_;
};
BuiltStyledStreamWriter::BuiltStyledStreamWriter(
- JSONCPP_STRING const& indentation, CommentStyle::Enum cs,
- JSONCPP_STRING const& colonSymbol, JSONCPP_STRING const& nullSymbol,
- JSONCPP_STRING const& endingLineFeedSymbol, bool useSpecialFloats,
- unsigned int precision)
+ JSONCPP_STRING const& indentation,
+ CommentStyle::Enum cs,
+ JSONCPP_STRING const& colonSymbol,
+ JSONCPP_STRING const& nullSymbol,
+ JSONCPP_STRING const& endingLineFeedSymbol,
+ bool useSpecialFloats,
+ unsigned int precision)
: rightMargin_(74)
, indentation_(indentation)
, cs_(cs)
@@ -1013,276 +932,247 @@ BuiltStyledStreamWriter::BuiltStyledStreamWriter(
}
int BuiltStyledStreamWriter::write(Value const& root, JSONCPP_OSTREAM* sout)
{
- this->sout_ = sout;
- this->addChildValues_ = false;
- this->indented_ = true;
- this->indentString_.clear();
- this->writeCommentBeforeValue(root);
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(root);
- this->writeCommentAfterValueOnSameLine(root);
- *this->sout_ << this->endingLineFeedSymbol_;
- this->sout_ = NULL;
+ sout_ = sout;
+ addChildValues_ = false;
+ indented_ = true;
+ indentString_.clear();
+ writeCommentBeforeValue(root);
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(root);
+ writeCommentAfterValueOnSameLine(root);
+ *sout_ << endingLineFeedSymbol_;
+ sout_ = NULL;
return 0;
}
-void BuiltStyledStreamWriter::writeValue(Value const& value)
-{
+void BuiltStyledStreamWriter::writeValue(Value const& value) {
switch (value.type()) {
- case nullValue:
- this->pushValue(this->nullSymbol_);
- break;
- case intValue:
- this->pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- this->pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- this->pushValue(valueToString(value.asDouble(), this->useSpecialFloats_,
- this->precision_));
- break;
- case stringValue: {
- // Is NULL is possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->pushValue(
- valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
- else
- this->pushValue("");
- break;
- }
- case booleanValue:
- this->pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- this->writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- this->pushValue("{}");
- else {
- this->writeWithIndent("{");
- this->indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- JSONCPP_STRING const& name = *it;
- Value const& childValue = value[name];
- this->writeCommentBeforeValue(childValue);
- this->writeWithIndent(valueToQuotedStringN(
- name.data(), static_cast<unsigned>(name.length())));
- *this->sout_ << this->colonSymbol_;
- this->writeValue(childValue);
- if (++it == members.end()) {
- this->writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *this->sout_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ case nullValue:
+ pushValue(nullSymbol_);
+ break;
+ case intValue:
+ pushValue(valueToString(value.asLargestInt()));
+ break;
+ case uintValue:
+ pushValue(valueToString(value.asLargestUInt()));
+ break;
+ case realValue:
+ pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_));
+ break;
+ case stringValue:
+ {
+ // Is NULL is possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
+ else pushValue("");
+ break;
+ }
+ case booleanValue:
+ pushValue(valueToString(value.asBool()));
+ break;
+ case arrayValue:
+ writeArrayValue(value);
+ break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ if (members.empty())
+ pushValue("{}");
+ else {
+ writeWithIndent("{");
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;) {
+ JSONCPP_STRING const& name = *it;
+ Value const& childValue = value[name];
+ writeCommentBeforeValue(childValue);
+ writeWithIndent(valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length())));
+ *sout_ << colonSymbol_;
+ writeValue(childValue);
+ if (++it == members.end()) {
+ writeCommentAfterValueOnSameLine(childValue);
+ break;
}
- this->unindent();
- this->writeWithIndent("}");
+ *sout_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- } break;
+ unindent();
+ writeWithIndent("}");
+ }
+ } break;
}
}
-void BuiltStyledStreamWriter::writeArrayValue(Value const& value)
-{
+void BuiltStyledStreamWriter::writeArrayValue(Value const& value) {
unsigned size = value.size();
if (size == 0)
- this->pushValue("[]");
+ pushValue("[]");
else {
- bool isMultiLine =
- (this->cs_ == CommentStyle::All) || this->isMultineArray(value);
+ bool isMultiLine = (cs_ == CommentStyle::All) || isMultineArray(value);
if (isMultiLine) {
- this->writeWithIndent("[");
- this->indent();
- bool hasChildValue = !this->childValues_.empty();
+ writeWithIndent("[");
+ indent();
+ bool hasChildValue = !childValues_.empty();
unsigned index = 0;
for (;;) {
Value const& childValue = value[index];
- this->writeCommentBeforeValue(childValue);
+ writeCommentBeforeValue(childValue);
if (hasChildValue)
- this->writeWithIndent(this->childValues_[index]);
+ writeWithIndent(childValues_[index]);
else {
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(childValue);
- this->indented_ = false;
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(childValue);
+ indented_ = false;
}
if (++index == size) {
- this->writeCommentAfterValueOnSameLine(childValue);
+ writeCommentAfterValueOnSameLine(childValue);
break;
}
- *this->sout_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ *sout_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- this->unindent();
- this->writeWithIndent("]");
+ unindent();
+ writeWithIndent("]");
} else // output on a single line
{
- assert(this->childValues_.size() == size);
- *this->sout_ << "[";
- if (!this->indentation_.empty())
- *this->sout_ << " ";
+ assert(childValues_.size() == size);
+ *sout_ << "[";
+ if (!indentation_.empty()) *sout_ << " ";
for (unsigned index = 0; index < size; ++index) {
if (index > 0)
- *this->sout_ << ((!this->indentation_.empty()) ? ", " : ",");
- *this->sout_ << this->childValues_[index];
+ *sout_ << ((!indentation_.empty()) ? ", " : ",");
+ *sout_ << childValues_[index];
}
- if (!this->indentation_.empty())
- *this->sout_ << " ";
- *this->sout_ << "]";
+ if (!indentation_.empty()) *sout_ << " ";
+ *sout_ << "]";
}
}
}
-bool BuiltStyledStreamWriter::isMultineArray(Value const& value)
-{
+bool BuiltStyledStreamWriter::isMultineArray(Value const& value) {
ArrayIndex const size = value.size();
- bool isMultiLine = size * 3 >= this->rightMargin_;
- this->childValues_.clear();
+ bool isMultiLine = size * 3 >= rightMargin_;
+ childValues_.clear();
for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) {
Value const& childValue = value[index];
isMultiLine = ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
+ childValue.size() > 0);
}
if (!isMultiLine) // check if line length > max line length
{
- this->childValues_.reserve(size);
- this->addChildValues_ = true;
+ childValues_.reserve(size);
+ addChildValues_ = true;
ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
for (ArrayIndex index = 0; index < size; ++index) {
if (hasCommentForValue(value[index])) {
isMultiLine = true;
}
- this->writeValue(value[index]);
- lineLength +=
- static_cast<ArrayIndex>(this->childValues_[index].length());
+ writeValue(value[index]);
+ lineLength += static_cast<ArrayIndex>(childValues_[index].length());
}
- this->addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= this->rightMargin_;
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
}
return isMultiLine;
}
-void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value)
-{
- if (this->addChildValues_)
- this->childValues_.push_back(value);
+void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value) {
+ if (addChildValues_)
+ childValues_.push_back(value);
else
- *this->sout_ << value;
+ *sout_ << value;
}
-void BuiltStyledStreamWriter::writeIndent()
-{
+void BuiltStyledStreamWriter::writeIndent() {
// blep intended this to look at the so-far-written string
// to determine whether we are already indented, but
// with a stream we cannot do that. So we rely on some saved state.
// The caller checks indented_.
- if (!this->indentation_.empty()) {
+ if (!indentation_.empty()) {
// In this case, drop newlines too.
- *this->sout_ << '\n' << this->indentString_;
+ *sout_ << '\n' << indentString_;
}
}
-void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value)
-{
- if (!this->indented_)
- this->writeIndent();
- *this->sout_ << value;
- this->indented_ = false;
+void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value) {
+ if (!indented_) writeIndent();
+ *sout_ << value;
+ indented_ = false;
}
-void BuiltStyledStreamWriter::indent()
-{
- this->indentString_ += this->indentation_;
-}
+void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; }
-void BuiltStyledStreamWriter::unindent()
-{
- assert(this->indentString_.size() >= this->indentation_.size());
- this->indentString_.resize(this->indentString_.size() -
- this->indentation_.size());
+void BuiltStyledStreamWriter::unindent() {
+ assert(indentString_.size() >= indentation_.size());
+ indentString_.resize(indentString_.size() - indentation_.size());
}
-void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root)
-{
- if (this->cs_ == CommentStyle::None)
- return;
+void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) {
+ if (cs_ == CommentStyle::None) return;
if (!root.hasComment(commentBefore))
return;
- if (!this->indented_)
- this->writeIndent();
+ if (!indented_) writeIndent();
const JSONCPP_STRING& comment = root.getComment(commentBefore);
JSONCPP_STRING::const_iterator iter = comment.begin();
while (iter != comment.end()) {
- *this->sout_ << *iter;
- if (*iter == '\n' && (iter != comment.end() && *(iter + 1) == '/'))
+ *sout_ << *iter;
+ if (*iter == '\n' &&
+ (iter != comment.end() && *(iter + 1) == '/'))
// writeIndent(); // would write extra newline
- *this->sout_ << this->indentString_;
+ *sout_ << indentString_;
++iter;
}
- this->indented_ = false;
+ indented_ = false;
}
-void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(
- Value const& root)
-{
- if (this->cs_ == CommentStyle::None)
- return;
+void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) {
+ if (cs_ == CommentStyle::None) return;
if (root.hasComment(commentAfterOnSameLine))
- *this->sout_ << " " + root.getComment(commentAfterOnSameLine);
+ *sout_ << " " + root.getComment(commentAfterOnSameLine);
if (root.hasComment(commentAfter)) {
- this->writeIndent();
- *this->sout_ << root.getComment(commentAfter);
+ writeIndent();
+ *sout_ << root.getComment(commentAfter);
}
}
// static
-bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value)
-{
+bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) {
return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) || value.hasComment(commentAfter);
+ value.hasComment(commentAfterOnSameLine) ||
+ value.hasComment(commentAfter);
}
///////////////
// StreamWriter
StreamWriter::StreamWriter()
- : sout_(NULL)
+ : sout_(NULL)
{
}
StreamWriter::~StreamWriter()
{
}
StreamWriter::Factory::~Factory()
-{
-}
+{}
StreamWriterBuilder::StreamWriterBuilder()
{
- setDefaults(&this->settings_);
+ setDefaults(&settings_);
}
StreamWriterBuilder::~StreamWriterBuilder()
-{
-}
+{}
StreamWriter* StreamWriterBuilder::newStreamWriter() const
{
- JSONCPP_STRING indentation = this->settings_["indentation"].asString();
- JSONCPP_STRING cs_str = this->settings_["commentStyle"].asString();
- bool eyc = this->settings_["enableYAMLCompatibility"].asBool();
- bool dnp = this->settings_["dropNullPlaceholders"].asBool();
- bool usf = this->settings_["useSpecialFloats"].asBool();
- unsigned int pre = this->settings_["precision"].asUInt();
+ JSONCPP_STRING indentation = settings_["indentation"].asString();
+ JSONCPP_STRING cs_str = settings_["commentStyle"].asString();
+ bool eyc = settings_["enableYAMLCompatibility"].asBool();
+ bool dnp = settings_["dropNullPlaceholders"].asBool();
+ bool usf = settings_["useSpecialFloats"].asBool();
+ unsigned int pre = settings_["precision"].asUInt();
CommentStyle::Enum cs = CommentStyle::All;
if (cs_str == "All") {
cs = CommentStyle::All;
@@ -1301,11 +1191,11 @@ StreamWriter* StreamWriterBuilder::newStreamWriter() const
if (dnp) {
nullSymbol.clear();
}
- if (pre > 17)
- pre = 17;
+ if (pre > 17) pre = 17;
JSONCPP_STRING endingLineFeedSymbol;
- return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol,
- endingLineFeedSymbol, usf, pre);
+ return new BuiltStyledStreamWriter(
+ indentation, cs,
+ colonSymbol, nullSymbol, endingLineFeedSymbol, usf, pre);
}
static void getValidWriterKeys(std::set<JSONCPP_STRING>* valid_keys)
{
@@ -1320,24 +1210,23 @@ static void getValidWriterKeys(std::set<JSONCPP_STRING>* valid_keys)
bool StreamWriterBuilder::validate(Json::Value* invalid) const
{
Json::Value my_invalid;
- if (!invalid)
- invalid = &my_invalid; // so we do not need to test for NULL
+ if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL
Json::Value& inv = *invalid;
std::set<JSONCPP_STRING> valid_keys;
getValidWriterKeys(&valid_keys);
- Value::Members keys = this->settings_.getMemberNames();
+ Value::Members keys = settings_.getMemberNames();
size_t n = keys.size();
for (size_t i = 0; i < n; ++i) {
JSONCPP_STRING const& key = keys[i];
if (valid_keys.find(key) == valid_keys.end()) {
- inv[key] = this->settings_[key];
+ inv[key] = settings_[key];
}
}
return 0u == inv.size();
}
Value& StreamWriterBuilder::operator[](JSONCPP_STRING key)
{
- return this->settings_[key];
+ return settings_[key];
}
// static
void StreamWriterBuilder::setDefaults(Json::Value* settings)
@@ -1352,17 +1241,14 @@ void StreamWriterBuilder::setDefaults(Json::Value* settings)
//! [StreamWriterBuilderDefaults]
}
-JSONCPP_STRING writeString(StreamWriter::Factory const& builder,
- Value const& root)
-{
+JSONCPP_STRING writeString(StreamWriter::Factory const& builder, Value const& root) {
JSONCPP_OSTRINGSTREAM sout;
StreamWriterPtr const writer(builder.newStreamWriter());
writer->write(root, &sout);
return sout.str();
}
-JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root)
-{
+JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root) {
StreamWriterBuilder builder;
StreamWriterPtr const writer(builder.newStreamWriter());
writer->write(root, &sout);