From 76e03e635bbe84d29de7831f3181bb76547f36a8 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 22 May 2025 12:23:09 -0400 Subject: [PATCH] Skip past false,true,null directly if buffered --- src/parser3.h | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/parser3.h b/src/parser3.h index 1d69075..8fd714f 100644 --- a/src/parser3.h +++ b/src/parser3.h @@ -223,22 +223,49 @@ inline WeaselJsonStatus n_value(Parser3 *self) { case 't': ++self->buf; self->pop(); - if (auto s = self->push({T_R, T_U, N_TRUE})) { - return s; + if (self->len() >= 3) { + if (memcmp(self->buf, "rue", 3) == 0) { + self->callbacks->on_true_literal(self->data); + self->buf += 3; + } else { + return WeaselJson_REJECT; + } + } else { + if (auto s = self->push({T_R, T_U, N_TRUE})) { + return s; + } } break; case 'f': ++self->buf; self->pop(); - if (auto s = self->push({T_A, T_L, T_S, N_FALSE})) { - return s; + if (self->len() >= 4) { + if (memcmp(self->buf, "alse", 4) == 0) { + self->callbacks->on_false_literal(self->data); + self->buf += 4; + } else { + return WeaselJson_REJECT; + } + } else { + if (auto s = self->push({T_A, T_L, T_S, N_FALSE})) { + return s; + } } break; case 'n': ++self->buf; self->pop(); - if (auto s = self->push({T_U, T_L, N_NULL})) { - return s; + if (self->len() >= 3) { + if (memcmp(self->buf, "ull", 3) == 0) { + self->callbacks->on_null_literal(self->data); + self->buf += 3; + } else { + return WeaselJson_REJECT; + } + } else { + if (auto s = self->push({T_U, T_L, N_NULL})) { + return s; + } } break; default: