21 return ((ch >=
'0') && (ch <=
'9'));
25 static const char *
hatoui(
const char *first,
const char *last,
28 unsigned int result = 0;
29 for (; first != last; ++first)
35 else if (*first >=
'a' && *first <=
'f')
36 digit = *first -
'a' + 10;
38 else if (*first >=
'A' && *first <=
'F')
39 digit = *first -
'A' + 10;
44 result = 16 * result + digit;
52 const char *raw,
const char *end)
57 const char *rawStart = raw;
69 consumed = (raw - rawStart);
73 consumed = (raw - rawStart);
77 consumed = (raw - rawStart);
81 consumed = (raw - rawStart);
86 consumed = (raw - rawStart);
90 consumed = (raw - rawStart);
96 if (!strncmp(raw,
"null", 4)) {
98 consumed = (raw - rawStart);
100 }
else if (!strncmp(raw,
"true", 4)) {
102 consumed = (raw - rawStart);
104 }
else if (!strncmp(raw,
"false", 5)) {
106 consumed = (raw - rawStart);
125 const char *first = raw;
127 const char *firstDigit = first;
130 if ((*firstDigit ==
'0') &&
json_isdigit(firstDigit[1]))
136 if ((*first ==
'-') && (raw < end) && (!
json_isdigit(*raw)))
145 if (raw < end && *raw ==
'.') {
158 if (raw < end && (*raw ==
'e' || *raw ==
'E')) {
162 if (raw < end && (*raw ==
'-' || *raw ==
'+')) {
176 consumed = (raw - rawStart);
187 if (raw >= end || (
unsigned char)*raw < 0x20)
190 else if (*raw ==
'\\') {
198 case '\\': writer.
push_back(
'\\');
break;
207 unsigned int codepoint;
208 if (raw + 1 + 4 >= end ||
209 hatoui(raw + 1, raw + 1 + 4, codepoint) !=
224 else if (*raw ==
'"') {
230 writer.
push_back(
static_cast<unsigned char>(*raw));
238 consumed = (raw - rawStart);
255 #define expect(bit) (expectMask & (EXP_##bit))
256 #define setExpect(bit) (expectMask |= EXP_##bit)
257 #define clearExpect(bit) (expectMask &= ~EXP_##bit)
263 uint32_t expectMask = 0;
264 std::vector<UniValue*> stack;
266 std::string tokenVal;
267 unsigned int consumed;
270 const char* end = raw +
size;
287 }
else if (
expect(ARR_VALUE)) {
294 }
else if (
expect(OBJ_NAME)) {
299 }
else if (
expect(COLON)) {
324 stack.push_back(
this);
328 top->
values.push_back(tmpVal);
346 if (!stack.size() || (last_tok ==
JTOK_COMMA))
408 top->
values.push_back(tmpVal);
422 top->
values.push_back(tmpVal);
431 top->
keys.push_back(tokenVal);
441 top->
values.push_back(tmpVal);
451 }
while (!stack.empty ());