11 static bool json_isdigit(
int ch)
13 return ((ch >=
'0') && (ch <=
'9'));
17 static const char *hatoui(
const char *first,
const char *last,
20 unsigned int result = 0;
21 for (; first != last; ++first)
24 if (json_isdigit(*first))
27 else if (*first >=
'a' && *first <=
'f')
28 digit = *first -
'a' + 10;
30 else if (*first >=
'A' && *first <=
'F')
31 digit = *first -
'A' + 10;
36 result = 16 * result + digit;
44 const char *raw,
const char *
end)
49 const char *rawStart = raw;
51 while (raw <
end && (json_isspace(*raw)))
61 consumed = (raw - rawStart);
65 consumed = (raw - rawStart);
69 consumed = (raw - rawStart);
73 consumed = (raw - rawStart);
78 consumed = (raw - rawStart);
82 consumed = (raw - rawStart);
88 if (!strncmp(raw,
"null", 4)) {
90 consumed = (raw - rawStart);
92 }
else if (!strncmp(raw,
"true", 4)) {
94 consumed = (raw - rawStart);
96 }
else if (!strncmp(raw,
"false", 5)) {
98 consumed = (raw - rawStart);
117 const char *first = raw;
119 const char *firstDigit = first;
120 if (!json_isdigit(*firstDigit))
122 if ((*firstDigit ==
'0') && json_isdigit(firstDigit[1]))
128 if ((*first ==
'-') && (raw <
end) && (!json_isdigit(*raw)))
131 while (raw <
end && json_isdigit(*raw)) {
137 if (raw <
end && *raw ==
'.') {
141 if (raw >=
end || !json_isdigit(*raw))
143 while (raw <
end && json_isdigit(*raw)) {
150 if (raw <
end && (*raw ==
'e' || *raw ==
'E')) {
154 if (raw <
end && (*raw ==
'-' || *raw ==
'+')) {
159 if (raw >=
end || !json_isdigit(*raw))
161 while (raw <
end && json_isdigit(*raw)) {
168 consumed = (raw - rawStart);
179 if (raw >=
end || (
unsigned char)*raw < 0x20)
182 else if (*raw ==
'\\') {
190 case '\\': writer.
push_back(
'\\');
break;
199 unsigned int codepoint;
200 if (raw + 1 + 4 >=
end ||
201 hatoui(raw + 1, raw + 1 + 4, codepoint) !=
216 else if (*raw ==
'"') {
230 consumed = (raw - rawStart);
247 #define expect(bit) (expectMask & (EXP_##bit)) 248 #define setExpect(bit) (expectMask |= EXP_##bit) 249 #define clearExpect(bit) (expectMask &= ~EXP_##bit) 255 uint32_t expectMask = 0;
256 std::vector<UniValue*> stack;
258 std::string tokenVal;
259 unsigned int consumed;
271 bool isValueOpen = jsonTokenIsValue(tok) ||
279 }
else if (
expect(ARR_VALUE)) {
286 }
else if (
expect(OBJ_NAME)) {
291 }
else if (
expect(COLON)) {
316 stack.push_back(
this);
320 top->
values.push_back(tmpVal);
335 if (!stack.size() || (last_tok ==
JTOK_COMMA))
397 top->
values.push_back(tmpVal);
411 top->
values.push_back(tmpVal);
420 top->
keys.push_back(tokenVal);
430 top->
values.push_back(tmpVal);
440 }
while (!stack.empty ());
bool read(const char *raw, size_t len)
enum VType getType() const
std::vector< UniValue > values
void push_back(unsigned char ch)
Filter that generates and validates UTF-8, as well as collates UTF-16 surrogate pairs as specified in...
enum jtokentype getJsonToken(std::string &tokenVal, unsigned int &consumed, const char *raw, const char *end)
bool push_back(const UniValue &val)
std::vector< std::string > keys
void push_back_u(unsigned int codepoint_)