From 05d5493fafc81d00a8011c5e97a58f6f1a59d54f Mon Sep 17 00:00:00 2001 From: 0xDyews <219920166+0xDyews@users.noreply.github.com> Date: Tue, 15 Sep 2026 19:30:25 +0200 Subject: [PATCH] Fix JSON number parsing --- src/jsonparse.hpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/jsonparse.hpp b/src/jsonparse.hpp index 8d100b8..78ca6af 100644 --- a/src/jsonparse.hpp +++ b/src/jsonparse.hpp @@ -190,14 +190,27 @@ struct Parser { bool parse_number(JsonValue& out) { size_t start = i; - if (i < s.size() && (s[i] == '-' || s[i] == '+')) ++i; - bool any = false; - while (i < s.size() && ((s[i] >= '0' && s[i] <= '9') || s[i] == '.' || s[i] == 'e' || - s[i] == 'E' || s[i] == '+' || s[i] == '-')) { + if (i < s.size() && s[i] == '-') ++i; + if (i >= s.size()) return false; + if (s[i] == '0') { + ++i; + if (i < s.size() && s[i] >= '0' && s[i] <= '9') return false; + } else if (s[i] >= '1' && s[i] <= '9') { + while (i < s.size() && s[i] >= '0' && s[i] <= '9') ++i; + } else { + return false; + } + if (i < s.size() && s[i] == '.') { + ++i; + if (i >= s.size() || s[i] < '0' || s[i] > '9') return false; + while (i < s.size() && s[i] >= '0' && s[i] <= '9') ++i; + } + if (i < s.size() && (s[i] == 'e' || s[i] == 'E')) { ++i; - any = true; + if (i < s.size() && (s[i] == '+' || s[i] == '-')) ++i; + if (i >= s.size() || s[i] < '0' || s[i] > '9') return false; + while (i < s.size() && s[i] >= '0' && s[i] <= '9') ++i; } - if (!any) return false; std::string tok(s.substr(start, i - start)); try { out.num = std::stod(tok);