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 | 671 | qpdf_offset_t offset; |
| 672 | 672 | bool done; |
| 673 | 673 | std::string token; |
| 674 | + qpdf_offset_t token_start{0}; | |
| 674 | 675 | parser_state_e parser_state; |
| 675 | 676 | std::vector<std::shared_ptr<JSON>> stack; |
| 676 | 677 | std::vector<parser_state_e> ps_stack; |
| ... | ... | @@ -863,6 +864,7 @@ JSONParser::getToken() |
| 863 | 864 | action = append; |
| 864 | 865 | switch (lex_state) { |
| 865 | 866 | case ls_top: |
| 867 | + token_start = offset; | |
| 866 | 868 | if (*p == '"') { |
| 867 | 869 | lex_state = ls_string; |
| 868 | 870 | } else if (QUtil::is_space(*p)) { |
| ... | ... | @@ -1134,7 +1136,7 @@ JSONParser::handleToken() |
| 1134 | 1136 | if (token.length() < 2) { |
| 1135 | 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 | 1142 | std::shared_ptr<JSON> item; |
| ... | ... | @@ -1142,12 +1144,12 @@ JSONParser::handleToken() |
| 1142 | 1144 | switch (lex_state) { |
| 1143 | 1145 | case ls_begin_dict: |
| 1144 | 1146 | item = std::make_shared<JSON>(JSON::makeDictionary()); |
| 1145 | - item->setStart(offset - toO(token.length())); | |
| 1147 | + item->setStart(token_start); | |
| 1146 | 1148 | break; |
| 1147 | 1149 | |
| 1148 | 1150 | case ls_begin_array: |
| 1149 | 1151 | item = std::make_shared<JSON>(JSON::makeArray()); |
| 1150 | - item->setStart(offset - toO(token.length())); | |
| 1152 | + item->setStart(token_start); | |
| 1151 | 1153 | break; |
| 1152 | 1154 | |
| 1153 | 1155 | case ls_colon: |
| ... | ... | @@ -1296,7 +1298,7 @@ JSONParser::handleToken() |
| 1296 | 1298 | } |
| 1297 | 1299 | } else if (item.get()) { |
| 1298 | 1300 | if (!(item->isArray() || item->isDictionary())) { |
| 1299 | - item->setStart(offset - toO(token.length())); | |
| 1301 | + item->setStart(token_start); | |
| 1300 | 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 | 2 | WARNING: qjson-objects-not-dict.json: "qpdf[1].trailer" was not seen |
| 3 | 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 | 2 | WARNING: qjson-stream-not-dict.json: "qpdf[1].trailer" was not seen |
| 3 | 3 | qpdf: qjson-stream-not-dict.json: errors found in JSON | ... | ... |
qpdf/qtest/qpdf/qjson-trailer-not-dict.out