mirror of
https://github.com/JakubMelka/PDF4QT.git
synced 2024-12-28 01:00:40 +01:00
Bugfix: Invalid parsing of postscript function
This commit is contained in:
parent
8bd2ca6386
commit
5b8b1de2db
@ -1663,6 +1663,7 @@ PDFPostScriptFunction::Program PDFPostScriptFunction::parseProgram(const QByteAr
|
|||||||
|
|
||||||
Program result;
|
Program result;
|
||||||
PDFLexicalAnalyzer parser(adjustedArray.constBegin(), adjustedArray.constEnd());
|
PDFLexicalAnalyzer parser(adjustedArray.constBegin(), adjustedArray.constEnd());
|
||||||
|
parser.setTokenizingPostScriptFunction();
|
||||||
|
|
||||||
std::stack<InstructionPointer> blockCallStack;
|
std::stack<InstructionPointer> blockCallStack;
|
||||||
while (true)
|
while (true)
|
||||||
|
@ -32,7 +32,8 @@ namespace pdf
|
|||||||
PDFLexicalAnalyzer::PDFLexicalAnalyzer(const char* begin, const char* end) :
|
PDFLexicalAnalyzer::PDFLexicalAnalyzer(const char* begin, const char* end) :
|
||||||
m_begin(begin),
|
m_begin(begin),
|
||||||
m_current(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));
|
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
|
else
|
||||||
{
|
{
|
||||||
error(tr("Unexpected character '%1' in the stream.").arg(lookChar()));
|
error(tr("Unexpected character '%1' in the stream.").arg(lookChar()));
|
||||||
|
@ -153,6 +153,9 @@ public:
|
|||||||
/// \param position Position, from which the search is started
|
/// \param position Position, from which the search is started
|
||||||
PDFInteger findSubstring(const char* str, PDFInteger position) const;
|
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
|
/// Returns true, if character is a whitespace character according to the PDF 1.7 specification
|
||||||
/// \param character Character to be tested
|
/// \param character Character to be tested
|
||||||
static constexpr bool isWhitespace(char character);
|
static constexpr bool isWhitespace(char character);
|
||||||
@ -198,6 +201,7 @@ private:
|
|||||||
const char* m_begin;
|
const char* m_begin;
|
||||||
const char* m_current;
|
const char* m_current;
|
||||||
const char* m_end;
|
const char* m_end;
|
||||||
|
bool m_tokenizingPostScriptFunction;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Parsing context. Used for example to detect cyclic reference errors.
|
/// Parsing context. Used for example to detect cyclic reference errors.
|
||||||
|
Loading…
Reference in New Issue
Block a user