aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2023-01-23 20:51:27 +0100
committerm-holger <m-holger@kubitscheck.org>2023-02-01 15:01:57 +0100
commitbfda62aeeb72355b5e8b6fbcdc94c50afaa366ab (patch)
tree9b820e5894fa3000703f276e5b68cd40982aa9de
parent08e768909d9760a3588b8a8eaaeda0b357a85c62 (diff)
downloadqpdf-bfda62aeeb72355b5e8b6fbcdc94c50afaa366ab.tar.zst
In JSONParser add lex_state ls_number_before_point
-rw-r--r--libqpdf/JSON.cc30
1 files changed, 26 insertions, 4 deletions
diff --git a/libqpdf/JSON.cc b/libqpdf/JSON.cc
index 1c3378a7..c8c4fdb0 100644
--- a/libqpdf/JSON.cc
+++ b/libqpdf/JSON.cc
@@ -649,6 +649,7 @@ namespace
ls_number,
ls_number_minus,
ls_number_leading_zero,
+ ls_number_before_point,
ls_alpha,
ls_string,
ls_backslash,
@@ -820,7 +821,7 @@ JSONParser::numberError()
"JSON: offset " + std::to_string(offset) +
": numeric literal: e already seen");
} else if ((*p == '+') || (*p == '-')) {
- // QTC::TC("libtests", "JSON parse unexpected sign");
+ QTC::TC("libtests", "JSON parse unexpected sign");
throw std::runtime_error(
"JSON: offset " + std::to_string(offset) +
": numeric literal: unexpected sign");
@@ -870,7 +871,7 @@ JSONParser::getToken()
number_saw_point = false;
number_saw_e = false;
} else if ((*p >= '1') && (*p <= '9')) {
- lex_state = ls_number;
+ lex_state = ls_number_before_point;
number_before_point = 1;
number_after_point = 0;
number_after_e = 0;
@@ -903,7 +904,7 @@ JSONParser::getToken()
case ls_number_minus:
if ((*p >= '1') && (*p <= '9')) {
++number_before_point;
- lex_state = ls_number;
+ lex_state = ls_number_before_point;
} else if (*p == '0') {
++number_before_point;
lex_state = ls_number_leading_zero;
@@ -934,6 +935,26 @@ JSONParser::getToken()
}
break;
+ case ls_number_before_point:
+ if ((*p >= '0') && (*p <= '9')) {
+ ++number_before_point;
+ } else if (*p == '.') {
+ number_saw_point = true;
+ lex_state = ls_number;
+ } else if (*p == 'e') {
+ number_saw_e = true;
+ lex_state = ls_number;
+ } else if (QUtil::is_space(*p)) {
+ action = ignore;
+ ready = true;
+ } else if (strchr("{}[]:,", *p)) {
+ action = reread;
+ ready = true;
+ } else {
+ numberError();
+ }
+ break;
+
case ls_number:
if ((*p >= '0') && (*p <= '9')) {
if (number_saw_e) {
@@ -970,7 +991,6 @@ JSONParser::getToken()
if (number_saw_e && (number_after_e == 0)) {
// okay
} else {
- QTC::TC("libtests", "JSON parse unexpected sign");
throw std::runtime_error(
"JSON: offset " + std::to_string(offset) +
": numeric literal: unexpected sign");
@@ -1062,6 +1082,7 @@ JSONParser::getToken()
throw std::logic_error("tok_start set in ls_top while parsing");
break;
+ case ls_number_before_point:
case ls_number:
case ls_number_minus:
case ls_number_leading_zero:
@@ -1137,6 +1158,7 @@ JSONParser::handleToken()
}
break;
+ case ls_number_before_point:
case ls_number:
case ls_number_minus:
case ls_number_leading_zero: