Commit bb89a60320c44199e40c24c3c4681d4a2e41ff97

Authored by m-holger
1 parent 39dfd305

Add data member JSONParser::token_start

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