mirror of
https://github.com/qpdf/qpdf.git
synced 2024-06-29 16:43:35 +00:00
ec9e310c9e
Add a version of expectInlineImage that takes an input source and searches for EI. This is in preparation for improving the way EI is found. This commit just refactors the code without changing the functionality and adds tests to make sure the old and new code behave identically.
75 lines
1.8 KiB
C++
75 lines
1.8 KiB
C++
#include <qpdf/Pl_QPDFTokenizer.hh>
|
|
#include <qpdf/QTC.hh>
|
|
#include <qpdf/QUtil.hh>
|
|
#include <qpdf/BufferInputSource.hh>
|
|
#include <stdexcept>
|
|
#include <string.h>
|
|
|
|
Pl_QPDFTokenizer::Members::Members() :
|
|
filter(0),
|
|
buf("tokenizer buffer")
|
|
{
|
|
}
|
|
|
|
Pl_QPDFTokenizer::Members::~Members()
|
|
{
|
|
}
|
|
|
|
Pl_QPDFTokenizer::Pl_QPDFTokenizer(char const* identifier,
|
|
QPDFObjectHandle::TokenFilter* filter,
|
|
Pipeline* next) :
|
|
Pipeline(identifier, next),
|
|
m(new Members)
|
|
{
|
|
m->filter = filter;
|
|
QPDFObjectHandle::TokenFilter::PipelineAccessor::setPipeline(
|
|
m->filter, next);
|
|
m->tokenizer.allowEOF();
|
|
m->tokenizer.includeIgnorable();
|
|
}
|
|
|
|
Pl_QPDFTokenizer::~Pl_QPDFTokenizer()
|
|
{
|
|
}
|
|
|
|
void
|
|
Pl_QPDFTokenizer::write(unsigned char* data, size_t len)
|
|
{
|
|
this->m->buf.write(data, len);
|
|
}
|
|
|
|
void
|
|
Pl_QPDFTokenizer::finish()
|
|
{
|
|
this->m->buf.finish();
|
|
PointerHolder<InputSource> input =
|
|
new BufferInputSource("tokenizer data",
|
|
this->m->buf.getBuffer(), true);
|
|
|
|
while (true)
|
|
{
|
|
QPDFTokenizer::Token token = this->m->tokenizer.readToken(
|
|
input, "offset " + QUtil::int_to_string(input->tell()),
|
|
true);
|
|
this->m->filter->handleToken(token);
|
|
if (token.getType() == QPDFTokenizer::tt_eof)
|
|
{
|
|
break;
|
|
}
|
|
else if ((token.getType() == QPDFTokenizer::tt_word) &&
|
|
(token.getValue() == "ID"))
|
|
{
|
|
QTC::TC("qpdf", "Pl_QPDFTokenizer found ID");
|
|
this->m->tokenizer.expectInlineImage(input);
|
|
}
|
|
}
|
|
this->m->filter->handleEOF();
|
|
QPDFObjectHandle::TokenFilter::PipelineAccessor::setPipeline(
|
|
m->filter, 0);
|
|
Pipeline* next = this->getNext(true);
|
|
if (next)
|
|
{
|
|
next->finish();
|
|
}
|
|
}
|