Remove Parser3::complete
This commit is contained in:
@@ -56,11 +56,7 @@ struct Parser3 {
|
|||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] WeaselJsonStatus parse(char *buf, int len) {
|
[[nodiscard]] WeaselJsonStatus parse(char *buf, int len);
|
||||||
complete = len == 0;
|
|
||||||
this->dataBegin = this->writeBuf = buf;
|
|
||||||
return keepGoing(this, buf, buf + len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void flushNumber(bool done, char *buf) {
|
void flushNumber(bool done, char *buf) {
|
||||||
int len = buf - dataBegin;
|
int len = buf - dataBegin;
|
||||||
@@ -104,7 +100,6 @@ struct Parser3 {
|
|||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
stackPtr = stack();
|
stackPtr = stack();
|
||||||
complete = false;
|
|
||||||
std::ignore = push({N_VALUE, N_WHITESPACE, T_EOF});
|
std::ignore = push({N_VALUE, N_WHITESPACE, T_EOF});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,7 +114,6 @@ struct Parser3 {
|
|||||||
uint32_t utf16Surrogate;
|
uint32_t utf16Surrogate;
|
||||||
uint32_t minCodepoint;
|
uint32_t minCodepoint;
|
||||||
int const stackSize;
|
int const stackSize;
|
||||||
bool complete;
|
|
||||||
NumDfa numDfa;
|
NumDfa numDfa;
|
||||||
Utf8Dfa strDfa;
|
Utf8Dfa strDfa;
|
||||||
};
|
};
|
||||||
@@ -158,8 +152,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_whitespace(Parser3 *self, char *buf,
|
|||||||
|
|
||||||
inline PRESERVE_NONE WeaselJsonStatus n_number(Parser3 *self, char *buf,
|
inline PRESERVE_NONE WeaselJsonStatus n_number(Parser3 *self, char *buf,
|
||||||
char *bufEnd) {
|
char *bufEnd) {
|
||||||
|
bool complete = buf == bufEnd;
|
||||||
buf = (char *)self->numDfa.scan(buf, bufEnd);
|
buf = (char *)self->numDfa.scan(buf, bufEnd);
|
||||||
if (buf == bufEnd && !self->complete) {
|
if (buf == bufEnd && !complete) {
|
||||||
self->flushNumber(false, buf);
|
self->flushNumber(false, buf);
|
||||||
return WeaselJson_AGAIN;
|
return WeaselJson_AGAIN;
|
||||||
}
|
}
|
||||||
@@ -346,6 +341,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_value(Parser3 *self, char *buf,
|
|||||||
default:
|
default:
|
||||||
[[unlikely]] return WeaselJson_REJECT;
|
[[unlikely]] return WeaselJson_REJECT;
|
||||||
}
|
}
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,6 +360,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_object2(Parser3 *self, char *buf,
|
|||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
self->callbacks->on_end_object(self->userdata);
|
self->callbacks->on_end_object(self->userdata);
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
case '"':
|
case '"':
|
||||||
++buf;
|
++buf;
|
||||||
@@ -371,6 +372,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_object2(Parser3 *self, char *buf,
|
|||||||
if (auto s = self->push({N_STRING2, T_COLON, N_VALUE, N_OBJECT3})) {
|
if (auto s = self->push({N_STRING2, T_COLON, N_VALUE, N_OBJECT3})) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
default:
|
default:
|
||||||
[[unlikely]] return WeaselJson_REJECT;
|
[[unlikely]] return WeaselJson_REJECT;
|
||||||
@@ -390,6 +394,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_object3(Parser3 *self, char *buf,
|
|||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
self->callbacks->on_end_object(self->userdata);
|
self->callbacks->on_end_object(self->userdata);
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
case ',':
|
case ',':
|
||||||
++buf;
|
++buf;
|
||||||
@@ -397,6 +404,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_object3(Parser3 *self, char *buf,
|
|||||||
if (auto s = self->push({N_STRING, T_COLON, N_VALUE, N_OBJECT3})) {
|
if (auto s = self->push({N_STRING, T_COLON, N_VALUE, N_OBJECT3})) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
default:
|
default:
|
||||||
[[unlikely]] return WeaselJson_REJECT;
|
[[unlikely]] return WeaselJson_REJECT;
|
||||||
@@ -416,6 +426,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_array2(Parser3 *self, char *buf,
|
|||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
self->callbacks->on_end_array(self->userdata);
|
self->callbacks->on_end_array(self->userdata);
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
default:
|
default:
|
||||||
self->pop();
|
self->pop();
|
||||||
@@ -439,6 +452,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_array3(Parser3 *self, char *buf,
|
|||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
self->callbacks->on_end_array(self->userdata);
|
self->callbacks->on_end_array(self->userdata);
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
case ',':
|
case ',':
|
||||||
++buf;
|
++buf;
|
||||||
@@ -446,6 +462,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_array3(Parser3 *self, char *buf,
|
|||||||
if (auto s = self->push({N_VALUE, N_ARRAY3})) {
|
if (auto s = self->push({N_VALUE, N_ARRAY3})) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
default:
|
default:
|
||||||
[[unlikely]] return WeaselJson_REJECT;
|
[[unlikely]] return WeaselJson_REJECT;
|
||||||
@@ -470,6 +489,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_string(Parser3 *self, char *buf,
|
|||||||
if (auto s = self->push({N_STRING2})) {
|
if (auto s = self->push({N_STRING2})) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -789,6 +811,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_true(Parser3 *self, char *buf,
|
|||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
self->callbacks->on_true_literal(self->userdata);
|
self->callbacks->on_true_literal(self->userdata);
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
} else [[unlikely]] {
|
} else [[unlikely]] {
|
||||||
return WeaselJson_REJECT;
|
return WeaselJson_REJECT;
|
||||||
@@ -804,6 +829,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_false(Parser3 *self, char *buf,
|
|||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
self->callbacks->on_false_literal(self->userdata);
|
self->callbacks->on_false_literal(self->userdata);
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
} else [[unlikely]] {
|
} else [[unlikely]] {
|
||||||
return WeaselJson_REJECT;
|
return WeaselJson_REJECT;
|
||||||
@@ -819,6 +847,9 @@ inline PRESERVE_NONE WeaselJsonStatus n_null(Parser3 *self, char *buf,
|
|||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
self->callbacks->on_null_literal(self->userdata);
|
self->callbacks->on_null_literal(self->userdata);
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
} else [[unlikely]] {
|
} else [[unlikely]] {
|
||||||
return WeaselJson_REJECT;
|
return WeaselJson_REJECT;
|
||||||
@@ -839,18 +870,21 @@ inline PRESERVE_NONE WeaselJsonStatus singleChar(Parser3 *self, char *buf,
|
|||||||
if (*buf == kChar) {
|
if (*buf == kChar) {
|
||||||
++buf;
|
++buf;
|
||||||
self->pop();
|
self->pop();
|
||||||
|
if (buf == bufEnd) {
|
||||||
|
return WeaselJson_AGAIN;
|
||||||
|
}
|
||||||
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
MUSTTAIL return Parser3::keepGoing(self, buf, bufEnd);
|
||||||
} else [[unlikely]] {
|
} else [[unlikely]] {
|
||||||
return WeaselJson_REJECT;
|
return WeaselJson_REJECT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PRESERVE_NONE WeaselJsonStatus t_eof(Parser3 *self, char *buf,
|
inline PRESERVE_NONE WeaselJsonStatus t_eof(Parser3 *, char *buf,
|
||||||
char *bufEnd) {
|
char *bufEnd) {
|
||||||
if (buf != bufEnd) [[unlikely]] {
|
if (buf != bufEnd) [[unlikely]] {
|
||||||
return WeaselJson_REJECT;
|
return WeaselJson_REJECT;
|
||||||
}
|
}
|
||||||
return self->complete ? WeaselJson_OK : WeaselJson_AGAIN;
|
return WeaselJson_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr inline struct ContinuationTable {
|
constexpr inline struct ContinuationTable {
|
||||||
@@ -918,14 +952,14 @@ constexpr inline struct ContinuationTable {
|
|||||||
const char *symbolNames[N_SYMBOL_COUNT]{};
|
const char *symbolNames[N_SYMBOL_COUNT]{};
|
||||||
} symbolTables;
|
} symbolTables;
|
||||||
|
|
||||||
|
inline WeaselJsonStatus Parser3::parse(char *buf, int len) {
|
||||||
|
this->dataBegin = this->writeBuf = buf;
|
||||||
|
return symbolTables.continuations[top()](this, buf, buf + len);
|
||||||
|
}
|
||||||
|
|
||||||
inline PRESERVE_NONE WeaselJsonStatus Parser3::keepGoing(Parser3 *self,
|
inline PRESERVE_NONE WeaselJsonStatus Parser3::keepGoing(Parser3 *self,
|
||||||
char *buf,
|
char *buf,
|
||||||
char *bufEnd) {
|
char *bufEnd) {
|
||||||
if (bufEnd - buf == 0) {
|
|
||||||
if (!self->complete) {
|
|
||||||
return WeaselJson_AGAIN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// printf("%s\n", symbolTables.symbolNames[self->top()]);
|
// printf("%s\n", symbolTables.symbolNames[self->top()]);
|
||||||
MUSTTAIL return symbolTables.continuations[self->top()](self, buf, bufEnd);
|
MUSTTAIL return symbolTables.continuations[self->top()](self, buf, bufEnd);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user