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: