Commit 8b3797569d0b09bf358e344136ce4d8a60e7a214
1 parent
71077f11
Add new method QPDFParser::make_description
Avoid creating new identical descriptions for each content stream token.
Showing
2 changed files
with
29 additions
and
7 deletions
libqpdf/QPDFObjectHandle.cc
| ... | ... | @@ -1621,6 +1621,7 @@ QPDFObjectHandle::parseContentStream_data( |
| 1621 | 1621 | auto input = BufferInputSource(description, stream_data.get()); |
| 1622 | 1622 | Tokenizer tokenizer; |
| 1623 | 1623 | tokenizer.allowEOF(); |
| 1624 | + auto sp_description = QPDFParser::make_description(description, "content"); | |
| 1624 | 1625 | bool empty = false; |
| 1625 | 1626 | while (QIntC::to_size(input.tell()) < stream_length) { |
| 1626 | 1627 | // Read a token and seek to the beginning. The offset we get from this process is the |
| ... | ... | @@ -1630,7 +1631,7 @@ QPDFObjectHandle::parseContentStream_data( |
| 1630 | 1631 | qpdf_offset_t offset = input.getLastOffset(); |
| 1631 | 1632 | input.seek(offset, SEEK_SET); |
| 1632 | 1633 | auto obj = |
| 1633 | - QPDFParser(input, "content", tokenizer, nullptr, context, false).parse(empty, true); | |
| 1634 | + QPDFParser(input, sp_description, "content", tokenizer, context).parse(empty, true); | |
| 1634 | 1635 | if (!obj) { |
| 1635 | 1636 | // EOF |
| 1636 | 1637 | break; | ... | ... |
libqpdf/qpdf/QPDFParser.hh
| ... | ... | @@ -26,9 +26,7 @@ class QPDFParser |
| 26 | 26 | tokenizer(*tokenizer.m), |
| 27 | 27 | decrypter(decrypter), |
| 28 | 28 | context(context), |
| 29 | - description( | |
| 30 | - std::make_shared<QPDFObject::Description>( | |
| 31 | - std::string(input.getName() + ", " + object_description + " at offset $PO"))), | |
| 29 | + description(make_description(input.getName(), object_description)), | |
| 32 | 30 | parse_pdf(parse_pdf) |
| 33 | 31 | { |
| 34 | 32 | } |
| ... | ... | @@ -45,16 +43,39 @@ class QPDFParser |
| 45 | 43 | tokenizer(tokenizer), |
| 46 | 44 | decrypter(decrypter), |
| 47 | 45 | context(context), |
| 48 | - description( | |
| 49 | - std::make_shared<QPDFObject::Description>( | |
| 50 | - std::string(input.getName() + ", " + object_description + " at offset $PO"))), | |
| 46 | + description(make_description(input.getName(), object_description)), | |
| 51 | 47 | parse_pdf(parse_pdf) |
| 52 | 48 | { |
| 53 | 49 | } |
| 50 | + | |
| 51 | + // Used by parseContentStream_data only | |
| 52 | + QPDFParser( | |
| 53 | + InputSource& input, | |
| 54 | + std::shared_ptr<QPDFObject::Description> sp_description, | |
| 55 | + std::string const& object_description, | |
| 56 | + qpdf::Tokenizer& tokenizer, | |
| 57 | + QPDF* context) : | |
| 58 | + input(input), | |
| 59 | + object_description(object_description), | |
| 60 | + tokenizer(tokenizer), | |
| 61 | + decrypter(nullptr), | |
| 62 | + context(context), | |
| 63 | + description(std::move(sp_description)), | |
| 64 | + parse_pdf(false) | |
| 65 | + { | |
| 66 | + } | |
| 54 | 67 | ~QPDFParser() = default; |
| 55 | 68 | |
| 56 | 69 | QPDFObjectHandle parse(bool& empty, bool content_stream); |
| 57 | 70 | |
| 71 | + static std::shared_ptr<QPDFObject::Description> | |
| 72 | + make_description(std::string const& input_name, std::string const& object_description) | |
| 73 | + { | |
| 74 | + using namespace std::literals; | |
| 75 | + return std::make_shared<QPDFObject::Description>( | |
| 76 | + input_name + ", " + object_description + " at offset $PO"); | |
| 77 | + } | |
| 78 | + | |
| 58 | 79 | private: |
| 59 | 80 | // Parser state. Note: |
| 60 | 81 | // state <= st_dictionary_value == (state = st_dictionary_key || state = st_dictionary_value) | ... | ... |