Commit bb89a60320c44199e40c24c3c4681d4a2e41ff97
1 parent
39dfd305
Add data member JSONParser::token_start
Showing
4 changed files
with
9 additions
and
7 deletions
libqpdf/JSON.cc
| @@ -671,6 +671,7 @@ namespace | @@ -671,6 +671,7 @@ namespace | ||
| 671 | qpdf_offset_t offset; | 671 | qpdf_offset_t offset; |
| 672 | bool done; | 672 | bool done; |
| 673 | std::string token; | 673 | std::string token; |
| 674 | + qpdf_offset_t token_start{0}; | ||
| 674 | parser_state_e parser_state; | 675 | parser_state_e parser_state; |
| 675 | std::vector<std::shared_ptr<JSON>> stack; | 676 | std::vector<std::shared_ptr<JSON>> stack; |
| 676 | std::vector<parser_state_e> ps_stack; | 677 | std::vector<parser_state_e> ps_stack; |
| @@ -863,6 +864,7 @@ JSONParser::getToken() | @@ -863,6 +864,7 @@ JSONParser::getToken() | ||
| 863 | action = append; | 864 | action = append; |
| 864 | switch (lex_state) { | 865 | switch (lex_state) { |
| 865 | case ls_top: | 866 | case ls_top: |
| 867 | + token_start = offset; | ||
| 866 | if (*p == '"') { | 868 | if (*p == '"') { |
| 867 | lex_state = ls_string; | 869 | lex_state = ls_string; |
| 868 | } else if (QUtil::is_space(*p)) { | 870 | } else if (QUtil::is_space(*p)) { |
| @@ -1134,7 +1136,7 @@ JSONParser::handleToken() | @@ -1134,7 +1136,7 @@ JSONParser::handleToken() | ||
| 1134 | if (token.length() < 2) { | 1136 | if (token.length() < 2) { |
| 1135 | throw std::logic_error("JSON string length < 2"); | 1137 | throw std::logic_error("JSON string length < 2"); |
| 1136 | } | 1138 | } |
| 1137 | - s_value = decode_string(token, offset - toO(token.length())); | 1139 | + s_value = decode_string(token, token_start); |
| 1138 | } | 1140 | } |
| 1139 | 1141 | ||
| 1140 | std::shared_ptr<JSON> item; | 1142 | std::shared_ptr<JSON> item; |
| @@ -1142,12 +1144,12 @@ JSONParser::handleToken() | @@ -1142,12 +1144,12 @@ JSONParser::handleToken() | ||
| 1142 | switch (lex_state) { | 1144 | switch (lex_state) { |
| 1143 | case ls_begin_dict: | 1145 | case ls_begin_dict: |
| 1144 | item = std::make_shared<JSON>(JSON::makeDictionary()); | 1146 | item = std::make_shared<JSON>(JSON::makeDictionary()); |
| 1145 | - item->setStart(offset - toO(token.length())); | 1147 | + item->setStart(token_start); |
| 1146 | break; | 1148 | break; |
| 1147 | 1149 | ||
| 1148 | case ls_begin_array: | 1150 | case ls_begin_array: |
| 1149 | item = std::make_shared<JSON>(JSON::makeArray()); | 1151 | item = std::make_shared<JSON>(JSON::makeArray()); |
| 1150 | - item->setStart(offset - toO(token.length())); | 1152 | + item->setStart(token_start); |
| 1151 | break; | 1153 | break; |
| 1152 | 1154 | ||
| 1153 | case ls_colon: | 1155 | case ls_colon: |
| @@ -1296,7 +1298,7 @@ JSONParser::handleToken() | @@ -1296,7 +1298,7 @@ JSONParser::handleToken() | ||
| 1296 | } | 1298 | } |
| 1297 | } else if (item.get()) { | 1299 | } else if (item.get()) { |
| 1298 | if (!(item->isArray() || item->isDictionary())) { | 1300 | if (!(item->isArray() || item->isDictionary())) { |
| 1299 | - item->setStart(offset - toO(token.length())); | 1301 | + item->setStart(token_start); |
| 1300 | item->setEnd(offset); | 1302 | item->setEnd(offset); |
| 1301 | } | 1303 | } |
| 1302 | 1304 |
qpdf/qtest/qpdf/qjson-objects-not-dict.out
| 1 | -WARNING: qjson-objects-not-dict.json (offset 82): "qpdf[1]" must be a dictionary | 1 | +WARNING: qjson-objects-not-dict.json (offset 81): "qpdf[1]" must be a dictionary |
| 2 | WARNING: qjson-objects-not-dict.json: "qpdf[1].trailer" was not seen | 2 | WARNING: qjson-objects-not-dict.json: "qpdf[1].trailer" was not seen |
| 3 | qpdf: qjson-objects-not-dict.json: errors found in JSON | 3 | qpdf: qjson-objects-not-dict.json: errors found in JSON |
qpdf/qtest/qpdf/qjson-stream-not-dict.out
| 1 | -WARNING: qjson-stream-not-dict.json (obj:1 0 R, offset 123): "stream" must be a dictionary | 1 | +WARNING: qjson-stream-not-dict.json (obj:1 0 R, offset 122): "stream" must be a dictionary |
| 2 | WARNING: qjson-stream-not-dict.json: "qpdf[1].trailer" was not seen | 2 | WARNING: qjson-stream-not-dict.json: "qpdf[1].trailer" was not seen |
| 3 | qpdf: qjson-stream-not-dict.json: errors found in JSON | 3 | qpdf: qjson-stream-not-dict.json: errors found in JSON |
qpdf/qtest/qpdf/qjson-trailer-not-dict.out
| 1 | -WARNING: qjson-trailer-not-dict.json (trailer, offset 1269): "trailer.value" must be a dictionary | 1 | +WARNING: qjson-trailer-not-dict.json (trailer, offset 1268): "trailer.value" must be a dictionary |
| 2 | qpdf: qjson-trailer-not-dict.json: errors found in JSON | 2 | qpdf: qjson-trailer-not-dict.json: errors found in JSON |