Bitcoin Core 28.99.0
P2P Digital Currency
univalue_write.cpp
Go to the documentation of this file.
1// Copyright 2014 BitPay Inc.
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or https://opensource.org/licenses/mit-license.php.
4
5#include <univalue.h>
6#include <univalue_escapes.h>
7
8#include <memory>
9#include <string>
10#include <vector>
11
12static std::string json_escape(const std::string& inS)
13{
14 std::string outS;
15 outS.reserve(inS.size() * 2);
16
17 for (unsigned int i = 0; i < inS.size(); i++) {
18 unsigned char ch = static_cast<unsigned char>(inS[i]);
19 const char *escStr = escapes[ch];
20
21 if (escStr)
22 outS += escStr;
23 else
24 outS += static_cast<char>(ch);
25 }
26
27 return outS;
28}
29
30// NOLINTNEXTLINE(misc-no-recursion)
31std::string UniValue::write(unsigned int prettyIndent,
32 unsigned int indentLevel) const
33{
34 std::string s;
35 s.reserve(1024);
36
37 unsigned int modIndent = indentLevel;
38 if (modIndent == 0)
39 modIndent = 1;
40
41 switch (typ) {
42 case VNULL:
43 s += "null";
44 break;
45 case VOBJ:
46 writeObject(prettyIndent, modIndent, s);
47 break;
48 case VARR:
49 writeArray(prettyIndent, modIndent, s);
50 break;
51 case VSTR:
52 s += "\"" + json_escape(val) + "\"";
53 break;
54 case VNUM:
55 s += val;
56 break;
57 case VBOOL:
58 s += (val == "1" ? "true" : "false");
59 break;
60 }
61
62 return s;
63}
64
65static void indentStr(unsigned int prettyIndent, unsigned int indentLevel, std::string& s)
66{
67 s.append(prettyIndent * indentLevel, ' ');
68}
69
70// NOLINTNEXTLINE(misc-no-recursion)
71void UniValue::writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const
72{
73 s += "[";
74 if (prettyIndent)
75 s += "\n";
76
77 for (unsigned int i = 0; i < values.size(); i++) {
78 if (prettyIndent)
79 indentStr(prettyIndent, indentLevel, s);
80 s += values[i].write(prettyIndent, indentLevel + 1);
81 if (i != (values.size() - 1)) {
82 s += ",";
83 }
84 if (prettyIndent)
85 s += "\n";
86 }
87
88 if (prettyIndent)
89 indentStr(prettyIndent, indentLevel - 1, s);
90 s += "]";
91}
92
93// NOLINTNEXTLINE(misc-no-recursion)
94void UniValue::writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const
95{
96 s += "{";
97 if (prettyIndent)
98 s += "\n";
99
100 for (unsigned int i = 0; i < keys.size(); i++) {
101 if (prettyIndent)
102 indentStr(prettyIndent, indentLevel, s);
103 s += "\"" + json_escape(keys[i]) + "\":";
104 if (prettyIndent)
105 s += " ";
106 s += values.at(i).write(prettyIndent, indentLevel + 1);
107 if (i != (values.size() - 1))
108 s += ",";
109 if (prettyIndent)
110 s += "\n";
111 }
112
113 if (prettyIndent)
114 indentStr(prettyIndent, indentLevel - 1, s);
115 s += "}";
116}
117
UniValue::VType typ
Definition: univalue.h:103
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string &s) const
@ VNULL
Definition: univalue.h:24
@ VOBJ
Definition: univalue.h:24
@ VSTR
Definition: univalue.h:24
@ VARR
Definition: univalue.h:24
@ VNUM
Definition: univalue.h:24
@ VBOOL
Definition: univalue.h:24
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
std::vector< UniValue > values
Definition: univalue.h:106
std::vector< std::string > keys
Definition: univalue.h:105
std::string val
Definition: univalue.h:104
void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string &s) const
static const char * escapes[256]
static std::string json_escape(const std::string &inS)
static void indentStr(unsigned int prettyIndent, unsigned int indentLevel, std::string &s)