dogecoin/lib/univalue_write.cpp
Patrick Lodder d29583af8f Squashed 'src/univalue/' changes from 16a1f7f6e..a44caf65f
a44caf65f Merge bitcoin-core/univalue-subtree#28: Import fixes for sanitizer reported issues
135254331 Import fixes for sanitizer reported issues
d5fb86940 refactor: use c++11 range based for loop in checkObject
ff9c37930 refactor: Use nullptr (c++11) instead of NULL
08a99754d build: use ax_cxx_compile_stdcxx.m4 to check for C++11 support
66d3713ce Merge bitcoin-core/univalue#29: ci: travis -> cirrus
808d48729 ci: travis -> cirrus
c390ac375 Merge bitcoin-core/univalue#19: Split sources for easier buildsystem integration
4a5b0a1c6 build: Move source entries out to sources.mk
6c7d94b33 build: cleanup wonky gen usage
a222637c6 Merge #23: Merge changes from jgarzik/univalue@1ae6a23
98fadc090 Merge #24: Push bool into array correctly
5f03f1f39 Push bool into array correctly
f77d0f718 Merge commit '1ae6a231a0169938eb3972c1d48dd17cba5947e1' into HEAD
98261b1e7 Merge #22: Clamp JSON object depth to PHP limit
54c401541 Clamp JSON object depth to PHP limit
5a58a4667 Merge #21: Remove hand-coded UniValue destructor.
b4cdfc4f4 Remove hand-coded UniValue destructor.
1ae6a231a Merge pull request #57 from MarcoFalke/test_fix
92bdd11f0 univalue_write: remove unneeded sstream.h include
ffb621c13 Merge pull request #56 from drodil/remove_sstream_header
f33acf9fe Merge commit '7890db9~' into HEAD
7fba60b5a Merge #17: [docs] Update readme
4577454e7 Merge #13: Fix typo
66e0adec4 Remove unnecessary sstream header from univalue.h
ac7e73cda [docs] Update readme
7890db99d Merge #11: Remove deprecated std pair wrappers
88967f658 Version 1.0.4
40e34852a Merge #14: Cleaned up namespace imports to reduce symbol collisions
1dc113dbe Merge pull request #50 from luke-jr/pushKV_bool
72392fb22 [tests] test pushKV for boolean values
c23132bcf Pushing boolean value to univalue correctly
4a4964729 Fix typo
85052a481 Remove deprecated std::pair wrappers
81faab26a Merge pull request #48 from fwolfst/47-UPDATE_MIT_LINK_TO_HTTPS
b17634ef2 Update URLs to MIT license.
51d3ab34b Merge #10: Add pushKV(key, boolean) function (replaces #5)
129bad96d [tests] test pushKV for boolean values
b3c44c947 Pushing boolean value to univalue correctly
07947ff2d Merge #9: [tests] Fix BOOST_CHECK_THROW macro
ec849d9a2 [tests] Fix BOOST_CHECK_THROW macro
88ab64f6b Merge pull request #46 from jasonbcox/master
35ed96da3 Merge pull request #44 from MarcoFalke/Mf1709-univalue-cherrypick-explicit
420c22629 Merge pull request #45 from MarcoFalke/Mf1710-univalue-revert-test
d208f986d Cleaned up namespace imports to reduce symbol collisions
31bc9f5a4 Merge #8: Remove unused Homebrew workaround
fa042093d Remove HomeBrew workaround
a523e08ae Merge #7: Declare single-argument (non-converting) constructors "explicit"
a9e53b38b Merge #4: Pull upstream
fe805ea74 Declare single-argument (non-converting) constructors "explicit"
8a2d6f1e3 Merge pull request #41 from jgarzik/get-obj-map
ba341a20d Add getObjMap() helper method.  Also, constify checkObject().
ceb119413 Handle .pushKV() and .checkObject() edge cases.
107db9829 Add ::push_back(double) method for feature parity.
d41530031 Move one-line implementation of UniValue::read() to header.
52e85b35b Move exception-throwing get_* methods into separate implementation module.
dac529675 README.md: update code quotes
3e31dcffb README.md: close code quote
d09b8429d Update README.md
f1b86edb4 Convert README to markdown style.
1dfe464ef Import UniValue class unit tests from bitcoin project.
0d3e74dd1 operator[] takes size_t index parameter (versus unsigned int)
640158fa2 Private findKey() method becomes size_t clean, and returns bool on failure.
709913585 Merge pull request #36 from ryanofsky/pr/end-str
a31231b51 Version 1.0.3
4fd5444d1 Reject unterminated strings
81eba332b Merge pull request #26 from isle2983/pushBackHelpers
36405413e Merge PR #32 from branch 'nul-not-special' of git://github.com/ryanofsky/univalue into merge
89bb07322 Merge pull request #31 from ryanofsky/raw-literals
511008c36 Merge pull request #30 from ryanofsky/test-driver
77974f3a9 Merge pull request #34 from paveljanik/20161116_Wshadow_codepoint
a38fcd355 Do not shadow member variable codepoint.
fd32d1ab8 Don't require nul-terminated string inputs
0bb1439d0 Support parsing raw literals in UniValue
28876d045 Merge pull request #29 from btcdrak/exportspace
839ccd71f Add test driver for JSONTestSuite
26ef3fff1 Remove trailing whitespace from JSON export
cfa0384d6 Convenience wrappers for push_back-ing integer types

git-subtree-dir: src/univalue
git-subtree-split: a44caf65fe55b9dd8ddb08f04c0f70409efd53b3
2021-10-17 22:05:37 +02:00

113 lines
2.7 KiB
C++

// Copyright 2014 BitPay Inc.
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://opensource.org/licenses/mit-license.php.
#include <iomanip>
#include <stdio.h>
#include "univalue.h"
#include "univalue_escapes.h"
static std::string json_escape(const std::string& inS)
{
std::string outS;
outS.reserve(inS.size() * 2);
for (unsigned int i = 0; i < inS.size(); i++) {
unsigned char ch = static_cast<unsigned char>(inS[i]);
const char *escStr = escapes[ch];
if (escStr)
outS += escStr;
else
outS += static_cast<char>(ch);
}
return outS;
}
std::string UniValue::write(unsigned int prettyIndent,
unsigned int indentLevel) const
{
std::string s;
s.reserve(1024);
unsigned int modIndent = indentLevel;
if (modIndent == 0)
modIndent = 1;
switch (typ) {
case VNULL:
s += "null";
break;
case VOBJ:
writeObject(prettyIndent, modIndent, s);
break;
case VARR:
writeArray(prettyIndent, modIndent, s);
break;
case VSTR:
s += "\"" + json_escape(val) + "\"";
break;
case VNUM:
s += val;
break;
case VBOOL:
s += (val == "1" ? "true" : "false");
break;
}
return s;
}
static void indentStr(unsigned int prettyIndent, unsigned int indentLevel, std::string& s)
{
s.append(prettyIndent * indentLevel, ' ');
}
void UniValue::writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const
{
s += "[";
if (prettyIndent)
s += "\n";
for (unsigned int i = 0; i < values.size(); i++) {
if (prettyIndent)
indentStr(prettyIndent, indentLevel, s);
s += values[i].write(prettyIndent, indentLevel + 1);
if (i != (values.size() - 1)) {
s += ",";
}
if (prettyIndent)
s += "\n";
}
if (prettyIndent)
indentStr(prettyIndent, indentLevel - 1, s);
s += "]";
}
void UniValue::writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const
{
s += "{";
if (prettyIndent)
s += "\n";
for (unsigned int i = 0; i < keys.size(); i++) {
if (prettyIndent)
indentStr(prettyIndent, indentLevel, s);
s += "\"" + json_escape(keys[i]) + "\":";
if (prettyIndent)
s += " ";
s += values.at(i).write(prettyIndent, indentLevel + 1);
if (i != (values.size() - 1))
s += ",";
if (prettyIndent)
s += "\n";
}
if (prettyIndent)
indentStr(prettyIndent, indentLevel - 1, s);
s += "}";
}