Bitcoin Core  24.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 
12 static 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 std::string UniValue::write(unsigned int prettyIndent,
31  unsigned int indentLevel) const
32 {
33  std::string s;
34  s.reserve(1024);
35 
36  unsigned int modIndent = indentLevel;
37  if (modIndent == 0)
38  modIndent = 1;
39 
40  switch (typ) {
41  case VNULL:
42  s += "null";
43  break;
44  case VOBJ:
45  writeObject(prettyIndent, modIndent, s);
46  break;
47  case VARR:
48  writeArray(prettyIndent, modIndent, s);
49  break;
50  case VSTR:
51  s += "\"" + json_escape(val) + "\"";
52  break;
53  case VNUM:
54  s += val;
55  break;
56  case VBOOL:
57  s += (val == "1" ? "true" : "false");
58  break;
59  }
60 
61  return s;
62 }
63 
64 static void indentStr(unsigned int prettyIndent, unsigned int indentLevel, std::string& s)
65 {
66  s.append(prettyIndent * indentLevel, ' ');
67 }
68 
69 void UniValue::writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const
70 {
71  s += "[";
72  if (prettyIndent)
73  s += "\n";
74 
75  for (unsigned int i = 0; i < values.size(); i++) {
76  if (prettyIndent)
77  indentStr(prettyIndent, indentLevel, s);
78  s += values[i].write(prettyIndent, indentLevel + 1);
79  if (i != (values.size() - 1)) {
80  s += ",";
81  }
82  if (prettyIndent)
83  s += "\n";
84  }
85 
86  if (prettyIndent)
87  indentStr(prettyIndent, indentLevel - 1, s);
88  s += "]";
89 }
90 
91 void UniValue::writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const
92 {
93  s += "{";
94  if (prettyIndent)
95  s += "\n";
96 
97  for (unsigned int i = 0; i < keys.size(); i++) {
98  if (prettyIndent)
99  indentStr(prettyIndent, indentLevel, s);
100  s += "\"" + json_escape(keys[i]) + "\":";
101  if (prettyIndent)
102  s += " ";
103  s += values.at(i).write(prettyIndent, indentLevel + 1);
104  if (i != (values.size() - 1))
105  s += ",";
106  if (prettyIndent)
107  s += "\n";
108  }
109 
110  if (prettyIndent)
111  indentStr(prettyIndent, indentLevel - 1, s);
112  s += "}";
113 }
114 
UniValue::VType typ
Definition: univalue.h:107
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string &s) const
@ VNULL
Definition: univalue.h:20
@ VOBJ
Definition: univalue.h:20
@ VSTR
Definition: univalue.h:20
@ VARR
Definition: univalue.h:20
@ VNUM
Definition: univalue.h:20
@ VBOOL
Definition: univalue.h:20
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
std::vector< UniValue > values
Definition: univalue.h:110
std::vector< std::string > keys
Definition: univalue.h:109
std::string val
Definition: univalue.h:108
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)