diff --git a/Userland/Libraries/LibPDF/Parser.cpp b/Userland/Libraries/LibPDF/Parser.cpp index 4e649ff967..9a1adad985 100644 --- a/Userland/Libraries/LibPDF/Parser.cpp +++ b/Userland/Libraries/LibPDF/Parser.cpp @@ -404,23 +404,30 @@ PDFErrorOr> Parser::parse_array() return make_object(values); } -PDFErrorOr> Parser::parse_dict() +PDFErrorOr> Parser::parse_dict_contents_until(char const* end) { - if (!m_reader.consume('<') || !m_reader.consume('<')) - return error("Expected dict to start with \"<<\""); - m_reader.consume_whitespace(); HashMap map; while (!m_reader.done()) { parse_comment(); - if (m_reader.matches(">>")) + if (m_reader.matches(end)) break; auto name = TRY(parse_name())->name(); auto value = TRY(parse_value()); map.set(name, value); } + return map; +} + +PDFErrorOr> Parser::parse_dict() +{ + if (!m_reader.consume('<') || !m_reader.consume('<')) + return error("Expected dict to start with \"<<\""); + + HashMap map = TRY(parse_dict_contents_until(">>")); + if (!m_reader.consume('>') || !m_reader.consume('>')) return error("Expected dict to end with \">>\""); m_reader.consume_whitespace(); diff --git a/Userland/Libraries/LibPDF/Parser.h b/Userland/Libraries/LibPDF/Parser.h index 99840cc773..c79de2924d 100644 --- a/Userland/Libraries/LibPDF/Parser.h +++ b/Userland/Libraries/LibPDF/Parser.h @@ -53,6 +53,7 @@ public: PDFErrorOr parse_literal_string(); PDFErrorOr parse_hex_string(); PDFErrorOr> parse_array(); + PDFErrorOr> parse_dict_contents_until(char const*); PDFErrorOr> parse_dict(); PDFErrorOr> parse_stream(NonnullRefPtr dict); PDFErrorOr> parse_operators();