diff options
Diffstat (limited to 'libqpdf/qpdf/QPDFParser.hh')
-rw-r--r-- | libqpdf/qpdf/QPDFParser.hh | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/libqpdf/qpdf/QPDFParser.hh b/libqpdf/qpdf/QPDFParser.hh index 35f9f603..7f5f7804 100644 --- a/libqpdf/qpdf/QPDFParser.hh +++ b/libqpdf/qpdf/QPDFParser.hh @@ -31,11 +31,44 @@ class QPDFParser QPDFObjectHandle parse(bool& empty, bool content_stream); private: - enum parser_state_e { st_top, st_start, st_stop, st_eof, st_dictionary, st_array }; + // Parser state. Note: + // state < st_dictionary_value == (state = st_dictionary_key || state = st_dictionary_value) + enum parser_state_e { st_dictionary_key, st_dictionary_value, st_array }; + struct StackFrame + { + StackFrame(std::shared_ptr<InputSource> const& input, parser_state_e state) : + state(state), + offset(input->tell()) + { + } + + std::vector<std::shared_ptr<QPDFObject>> olist; + std::map<std::string, QPDFObjectHandle> dict; + parser_state_e state; + std::string key; + qpdf_offset_t offset; + std::string contents_string; + qpdf_offset_t contents_offset{-1}; + int null_count{0}; + }; + + QPDFObjectHandle parseRemainder(bool content_stream); + void add(std::shared_ptr<QPDFObject>&& obj); + void addNull(); + void addInt(int count); + template <typename T, typename... Args> + void addScalar(Args&&... args); + bool tooManyBadTokens(); + void warnDuplicateKey(); + void fixMissingKeys(); void warn(qpdf_offset_t offset, std::string const& msg) const; void warn(std::string const& msg) const; void warn(QPDFExc const&) const; + template <typename T, typename... Args> + // Create a new scalar object complete with parsed offset and description. + // NB the offset includes any leading whitespace. + QPDFObjectHandle withDescription(Args&&... args); void setDescription(std::shared_ptr<QPDFObject>& obj, qpdf_offset_t parsed_offset); std::shared_ptr<InputSource> input; std::string const& object_description; @@ -43,6 +76,18 @@ class QPDFParser QPDFObjectHandle::StringDecrypter* decrypter; QPDF* context; std::shared_ptr<QPDFValue::Description> description; + std::vector<StackFrame> stack; + StackFrame* frame; + // Number of recent bad tokens. + int bad_count = 0; + // Number of good tokens since last bad token. Irrelevant if bad_count == 0. + int good_count = 0; + // Start offset including any leading whitespace. + qpdf_offset_t start; + // Number of successive integer tokens. + int int_count = 0; + long long int_buffer[2]{0, 0}; + qpdf_offset_t last_offset_buffer[2]{0, 0}; }; #endif // QPDFPARSER_HH |