24 return ((ch >=
'0') && (ch <=
'9'));
28 static const char *
hatoui(
const char *first,
const char *last,
31 unsigned int result = 0;
32 for (; first != last; ++first)
38 else if (*first >=
'a' && *first <=
'f')
39 digit = *first -
'a' + 10;
41 else if (*first >=
'A' && *first <=
'F')
42 digit = *first -
'A' + 10;
47 result = 16 * result + digit;
55 const char *raw,
const char *end)
60 const char *rawStart = raw;
72 consumed = (raw - rawStart);
76 consumed = (raw - rawStart);
80 consumed = (raw - rawStart);
84 consumed = (raw - rawStart);
89 consumed = (raw - rawStart);
93 consumed = (raw - rawStart);
99 if (!strncmp(raw,
"null", 4)) {
101 consumed = (raw - rawStart);
103 }
else if (!strncmp(raw,
"true", 4)) {
105 consumed = (raw - rawStart);
107 }
else if (!strncmp(raw,
"false", 5)) {
109 consumed = (raw - rawStart);
128 const char *first = raw;
130 const char *firstDigit = first;
133 if ((*firstDigit ==
'0') &&
json_isdigit(firstDigit[1]))
139 if ((*first ==
'-') && (raw < end) && (!
json_isdigit(*raw)))
148 if (raw < end && *raw ==
'.') {
161 if (raw < end && (*raw ==
'e' || *raw ==
'E')) {
165 if (raw < end && (*raw ==
'-' || *raw ==
'+')) {
179 consumed = (raw - rawStart);
190 if (raw >= end || (
unsigned char)*raw < 0x20)
193 else if (*raw ==
'\\') {
200 case '"': writer.push_back(
'\"');
break;
201 case '\\': writer.push_back(
'\\');
break;
202 case '/': writer.push_back(
'/');
break;
203 case 'b': writer.push_back(
'\b');
break;
204 case 'f': writer.push_back(
'\f');
break;
205 case 'n': writer.push_back(
'\n');
break;
206 case 'r': writer.push_back(
'\r');
break;
207 case 't': writer.push_back(
'\t');
break;
210 unsigned int codepoint;
211 if (raw + 1 + 4 >= end ||
212 hatoui(raw + 1, raw + 1 + 4, codepoint) !=
215 writer.push_back_u(codepoint);
227 else if (*raw ==
'"') {
233 writer.push_back(
static_cast<unsigned char>(*raw));
238 if (!writer.finalize())
241 consumed = (raw - rawStart);
258 #define expect(bit) (expectMask & (EXP_##bit))
259 #define setExpect(bit) (expectMask |= EXP_##bit)
260 #define clearExpect(bit) (expectMask &= ~EXP_##bit)
266 uint32_t expectMask = 0;
267 std::vector<UniValue*> stack;
269 std::string tokenVal;
270 unsigned int consumed;
273 const char* end = raw +
size;
290 }
else if (
expect(ARR_VALUE)) {
297 }
else if (
expect(OBJ_NAME)) {
302 }
else if (
expect(COLON)) {
327 stack.push_back(
this);
331 top->
values.push_back(tmpVal);
349 if (!stack.size() || (last_tok ==
JTOK_COMMA))
411 top->
values.push_back(tmpVal);
425 top->
values.push_back(tmpVal);
434 top->
keys.push_back(tokenVal);
444 top->
values.push_back(tmpVal);
454 }
while (!stack.empty ());
Filter that generates and validates UTF-8, as well as collates UTF-16 surrogate pairs as specified in...
void push_back(UniValue val)
enum VType getType() const
std::vector< UniValue > values
std::vector< std::string > keys
bool read(const char *raw, size_t len)
static bool jsonTokenIsValue(enum jtokentype jtt)
static bool json_isspace(int ch)
static bool json_isdigit(int ch)
static constexpr size_t MAX_JSON_DEPTH
enum jtokentype getJsonToken(std::string &tokenVal, unsigned int &consumed, const char *raw, const char *end)
static const char * hatoui(const char *first, const char *last, unsigned int &out)