diff --git a/src/parser3.h b/src/parser3.h index 7859d1b..caba48f 100644 --- a/src/parser3.h +++ b/src/parser3.h @@ -65,7 +65,7 @@ enum Symbol : uint8_t { struct Parser3 { Parser3(const WeaselJsonCallbacks *callbacks, void *data) : callbacks(callbacks), data(data) { - std::ignore = push({N_WHITESPACE, N_VALUE, N_WHITESPACE, T_EOF}); + std::ignore = push({N_VALUE, N_WHITESPACE, T_EOF}); } [[nodiscard]] WeaselJsonStatus parse(char *buf, int len) { @@ -137,7 +137,31 @@ struct Parser3 { uint32_t minCodepoint; }; +inline WeaselJsonStatus n_whitespace(Parser3 *self) { + if (self->len() == 0) { + self->pop(); + MUSTTAIL return Parser3::keepGoing(self); + } + while (tables.whitespace[uint8_t(*self->buf)]) { + ++self->buf; + if (self->buf == self->bufEnd) { + return WeaselJson_AGAIN; + } + } + self->pop(); + MUSTTAIL return Parser3::keepGoing(self); +} + inline WeaselJsonStatus n_value(Parser3 *self) { + if (self->len() == 0) { + MUSTTAIL return Parser3::keepGoing(self); + } + while (tables.whitespace[uint8_t(*self->buf)]) { + ++self->buf; + if (self->buf == self->bufEnd) { + return WeaselJson_AGAIN; + } + } switch (*self->buf) { case '{': self->pop(); @@ -223,8 +247,8 @@ inline WeaselJsonStatus n_object2(Parser3 *self) { MUSTTAIL return Parser3::keepGoing(self); case '"': self->pop(); - if (auto s = self->push({N_STRING, N_WHITESPACE, T_COLON, N_WHITESPACE, - N_VALUE, N_WHITESPACE, N_OBJECT3})) { + if (auto s = self->push({N_STRING, N_WHITESPACE, T_COLON, N_VALUE, + N_WHITESPACE, N_OBJECT3})) { return s; } MUSTTAIL return Parser3::keepGoing(self); @@ -244,7 +268,7 @@ inline WeaselJsonStatus n_object3(Parser3 *self) { ++self->buf; self->pop(); if (auto s = self->push({N_WHITESPACE, N_STRING, N_WHITESPACE, T_COLON, - N_WHITESPACE, N_VALUE, N_WHITESPACE, N_OBJECT3})) { + N_VALUE, N_WHITESPACE, N_OBJECT3})) { return s; } MUSTTAIL return Parser3::keepGoing(self); @@ -292,7 +316,7 @@ inline WeaselJsonStatus n_array3(Parser3 *self) { case ',': ++self->buf; self->pop(); - if (auto s = self->push({N_WHITESPACE, N_VALUE, N_WHITESPACE, N_ARRAY3})) { + if (auto s = self->push({N_VALUE, N_WHITESPACE, N_ARRAY3})) { return s; } MUSTTAIL return Parser3::keepGoing(self); @@ -762,21 +786,6 @@ inline WeaselJsonStatus n_sign(Parser3 *self) { } } -inline WeaselJsonStatus n_whitespace(Parser3 *self) { - if (self->len() == 0) { - self->pop(); - MUSTTAIL return Parser3::keepGoing(self); - } - while (tables.whitespace[uint8_t(*self->buf)]) { - ++self->buf; - if (self->buf == self->bufEnd) { - return WeaselJson_AGAIN; - } - } - self->pop(); - MUSTTAIL return Parser3::keepGoing(self); -} - inline WeaselJsonStatus n_true(Parser3 *self) { if (*self->buf == 'e') { ++self->buf;