Commit bb89a60320c44199e40c24c3c4681d4a2e41ff97

Authored by m-holger
1 parent 39dfd305

Add data member JSONParser::token_start

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
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 2 qpdf: qjson-trailer-not-dict.json: errors found in JSON
... ...