Bugfix: Invalid parsing of postscript function

This commit is contained in:
Jakub Melka 2021-02-26 19:21:27 +01:00
parent 8bd2ca6386
commit 5b8b1de2db
3 changed files with 17 additions and 1 deletions

View File

@ -1663,6 +1663,7 @@ PDFPostScriptFunction::Program PDFPostScriptFunction::parseProgram(const QByteAr
Program result;
PDFLexicalAnalyzer parser(adjustedArray.constBegin(), adjustedArray.constEnd());
parser.setTokenizingPostScriptFunction();
std::stack<InstructionPointer> blockCallStack;
while (true)

View File

@ -32,7 +32,8 @@ namespace pdf
PDFLexicalAnalyzer::PDFLexicalAnalyzer(const char* begin, const char* end) :
m_begin(begin),
m_current(begin),
m_end(end)
m_end(end),
m_tokenizingPostScriptFunction(false)
{
}
@ -454,6 +455,16 @@ PDFLexicalAnalyzer::Token PDFLexicalAnalyzer::fetch()
return Token(TokenType::Command, std::move(command));
}
}
else if (m_tokenizingPostScriptFunction)
{
const char currentChar = lookChar();
if (currentChar == CHAR_LEFT_CURLY_BRACKET || currentChar == CHAR_RIGHT_CURLY_BRACKET)
{
return Token(TokenType::Command, QByteArray(1, fetchChar()));
}
error(tr("Unexpected character '%1' in the stream.").arg(currentChar));
}
else
{
error(tr("Unexpected character '%1' in the stream.").arg(lookChar()));

View File

@ -153,6 +153,9 @@ public:
/// \param position Position, from which the search is started
PDFInteger findSubstring(const char* str, PDFInteger position) const;
/// Switch parser mode for tokenizing PostScript function
void setTokenizingPostScriptFunction() { m_tokenizingPostScriptFunction = true; }
/// Returns true, if character is a whitespace character according to the PDF 1.7 specification
/// \param character Character to be tested
static constexpr bool isWhitespace(char character);
@ -198,6 +201,7 @@ private:
const char* m_begin;
const char* m_current;
const char* m_end;
bool m_tokenizingPostScriptFunction;
};
/// Parsing context. Used for example to detect cyclic reference errors.