diff options
author | m-holger <m-holger@kubitscheck.org> | 2023-01-25 20:14:36 +0100 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2023-02-01 15:18:39 +0100 |
commit | 8fd6e1c5b24d0fc804c25004f398b39b5041b034 (patch) | |
tree | 31722dbdfda2ffeb789ccf72cda91a4f71d83e73 /libqpdf | |
parent | 6ea543e6c731db30b0807f531a445a66c66619b9 (diff) | |
download | qpdf-8fd6e1c5b24d0fc804c25004f398b39b5041b034.tar.zst |
Refactor handling of ls_number in JSONParser::getToken
Reflect that the ls_number case only handles the digits after an 'e'.
Also, change state to ls_number for all 'ready' numbers.
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/JSON.cc | 47 |
1 files changed, 9 insertions, 38 deletions
diff --git a/libqpdf/JSON.cc b/libqpdf/JSON.cc index 8e55b08c..3f1a3879 100644 --- a/libqpdf/JSON.cc +++ b/libqpdf/JSON.cc @@ -809,7 +809,7 @@ JSONParser::numberError() { if (*p == '.') { if (number_saw_e) { - // QTC::TC("libtests", "JSON parse point after e"); + QTC::TC("libtests", "JSON parse point after e"); throw std::runtime_error( "JSON: offset " + std::to_string(offset) + ": numeric literal: decimal point after e"); @@ -820,7 +820,7 @@ JSONParser::numberError() ": numeric literal: decimal point already seen"); } } else if (*p == 'e' || *p == 'E') { - // QTC::TC("libtests", "JSON parse duplicate e"); + QTC::TC("libtests", "JSON parse duplicate e"); throw std::runtime_error( "JSON: offset " + std::to_string(offset) + ": numeric literal: e already seen"); @@ -922,9 +922,11 @@ JSONParser::getToken() if (*p == '.') { lex_state = ls_number_point; } else if (QUtil::is_space(*p)) { + lex_state = ls_number; action = ignore; ready = true; } else if (strchr("{}[]:,", *p)) { + lex_state = ls_number; action = reread; ready = true; } else if (*p == 'e' || *p == 'E') { @@ -945,9 +947,11 @@ JSONParser::getToken() number_saw_point = true; lex_state = ls_number_point; } else if (QUtil::is_space(*p)) { + lex_state = ls_number; action = ignore; ready = true; } else if (strchr("{}[]:,", *p)) { + lex_state = ls_number; action = reread; ready = true; } else if (*p == 'e' || *p == 'E') { @@ -971,9 +975,11 @@ JSONParser::getToken() if ((*p >= '0') && (*p <= '9')) { ++number_after_point; } else if (QUtil::is_space(*p)) { + lex_state = ls_number; action = ignore; ready = true; } else if (strchr("{}[]:,", *p)) { + lex_state = ls_number; action = reread; ready = true; } else if (*p == 'e' || *p == 'E') { @@ -1004,44 +1010,9 @@ JSONParser::getToken() break; case ls_number: + // We only get here after we have seen an exponent. if ((*p >= '0') && (*p <= '9')) { - if (number_saw_e) { ++number_after_e; - } else if (number_saw_point) { - ++number_after_point; - } else { - ++number_before_point; - } - } else if (*p == '.') { - if (number_saw_e) { - QTC::TC("libtests", "JSON parse point after e"); - throw std::runtime_error( - "JSON: offset " + std::to_string(offset) + - ": numeric literal: decimal point after e"); - } else if (number_saw_point) { - throw std::runtime_error( - "JSON: offset " + std::to_string(offset) + - ": numeric literal: decimal point already seen"); - } else { - number_saw_point = true; - } - } else if (*p == 'e' || *p == 'E') { - if (number_saw_e) { - QTC::TC("libtests", "JSON parse duplicate e"); - throw std::runtime_error( - "JSON: offset " + std::to_string(offset) + - ": numeric literal: e already seen"); - } else { - number_saw_e = true; - } - } else if ((*p == '+') || (*p == '-')) { - if (number_saw_e && (number_after_e == 0)) { - // okay - } else { - throw std::runtime_error( - "JSON: offset " + std::to_string(offset) + - ": numeric literal: unexpected sign"); - } } else if (QUtil::is_space(*p)) { action = ignore; ready = true; |