mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-05-12 21:00:36 +02:00
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 REVERT: 16a1f7f6e Merge #3: Pull upstream REVERT: daf1285af Merge pull request #2 from jgarzik/master REVERT: f32df99e9 Merge branch '2016_04_unicode' into bitcoin REVERT: 280b191cb Merge remote-tracking branch 'jgarzik/master' into bitcoin REVERT: 2740c4f71 Merge branch '2015_11_escape_plan' into bitcoin git-subtree-dir: src/univalue git-subtree-split: fe805ea74f8919382720b09a905a14e81311b3ad
116 lines
2.6 KiB
C++
116 lines
2.6 KiB
C++
// Copyright 2014 BitPay Inc.
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
#include <stdio.h>
|
|
#include "univalue.h"
|
|
#include "univalue_escapes.h"
|
|
|
|
using namespace std;
|
|
|
|
static string json_escape(const string& inS)
|
|
{
|
|
string outS;
|
|
outS.reserve(inS.size() * 2);
|
|
|
|
for (unsigned int i = 0; i < inS.size(); i++) {
|
|
unsigned char ch = inS[i];
|
|
const char *escStr = escapes[ch];
|
|
|
|
if (escStr)
|
|
outS += escStr;
|
|
else
|
|
outS += ch;
|
|
}
|
|
|
|
return outS;
|
|
}
|
|
|
|
string UniValue::write(unsigned int prettyIndent,
|
|
unsigned int indentLevel) const
|
|
{
|
|
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, string& s)
|
|
{
|
|
s.append(prettyIndent * indentLevel, ' ');
|
|
}
|
|
|
|
void UniValue::writeArray(unsigned int prettyIndent, unsigned int indentLevel, 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, 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 += "}";
|
|
}
|
|
|