26 return ((ch >=
'0') && (ch <=
'9'));
30static const char *
hatoui(
const char *first,
const char *last,
33 unsigned int result = 0;
34 for (; first != last; ++first)
40 else if (*first >=
'a' && *first <=
'f')
41 digit = *first -
'a' + 10;
43 else if (*first >=
'A' && *first <=
'F')
44 digit = *first -
'A' + 10;
49 result = 16 * result + digit;
57 const char *raw,
const char *end)
62 const char *rawStart = raw;
74 consumed = (raw - rawStart);
78 consumed = (raw - rawStart);
82 consumed = (raw - rawStart);
86 consumed = (raw - rawStart);
91 consumed = (raw - rawStart);
95 consumed = (raw - rawStart);
101 if (!strncmp(raw,
"null", 4)) {
103 consumed = (raw - rawStart);
105 }
else if (!strncmp(raw,
"true", 4)) {
107 consumed = (raw - rawStart);
109 }
else if (!strncmp(raw,
"false", 5)) {
111 consumed = (raw - rawStart);
130 const char *first = raw;
132 const char *firstDigit = first;
135 if ((*firstDigit ==
'0') &&
json_isdigit(firstDigit[1]))
141 if ((*first ==
'-') && (raw < end) && (!
json_isdigit(*raw)))
150 if (raw < end && *raw ==
'.') {
163 if (raw < end && (*raw ==
'e' || *raw ==
'E')) {
167 if (raw < end && (*raw ==
'-' || *raw ==
'+')) {
181 consumed = (raw - rawStart);
192 if (raw >= end || (
unsigned char)*raw < 0x20)
195 else if (*raw ==
'\\') {
203 case '\\': writer.
push_back(
'\\');
break;
212 unsigned int codepoint;
213 if (raw + 1 + 4 >= end ||
214 hatoui(raw + 1, raw + 1 + 4, codepoint) !=
229 else if (*raw ==
'"') {
235 writer.
push_back(
static_cast<unsigned char>(*raw));
243 consumed = (raw - rawStart);
260#define expect(bit) (expectMask & (EXP_##bit))
261#define setExpect(bit) (expectMask |= EXP_##bit)
262#define clearExpect(bit) (expectMask &= ~EXP_##bit)
271 *
this = std::move(parsed);
279 uint32_t expectMask = 0;
280 std::vector<UniValue*> stack;
282 std::string tokenVal;
283 unsigned int consumed;
286 const char* raw{str_in.data()};
287 const char* end{raw + str_in.size()};
304 }
else if (
expect(ARR_VALUE)) {
311 }
else if (
expect(OBJ_NAME)) {
316 }
else if (
expect(COLON)) {
341 stack.push_back(
this);
345 top->
values.push_back(tmpVal);
363 if (!stack.size() || (last_tok ==
JTOK_COMMA))
425 top->
values.push_back(tmpVal);
439 top->
values.push_back(tmpVal);
448 top->
keys.push_back(tokenVal);
458 top->
values.push_back(tmpVal);
468 }
while (!stack.empty ());
Filter that generates and validates UTF-8, as well as collates UTF-16 surrogate pairs as specified in...
void push_back(unsigned char ch)
void push_back_u(unsigned int codepoint_)
void push_back(UniValue val)
enum VType getType() const
bool read_impl(std::string_view str_in)
Internal parser: May leave this value in an invalid state on failure.
std::vector< UniValue > values
std::vector< std::string > keys
bool read(std::string_view json)
Parse JSON; set value to null on failure.
char const * json() noexcept
Template to generate JSON data.
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)