aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFTokenizer.cc
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2022-10-04 21:50:36 +0200
committerJay Berkenbilt <jberkenbilt@users.noreply.github.com>2023-01-07 21:24:51 +0100
commit863d95e5676b0c03539c1cd9bacb31039d53b433 (patch)
tree0965ac3242a6e4eb4bb06eae230048dee3ad339c /libqpdf/QPDFTokenizer.cc
parenta07d2b4190bc0db778a254733dac88dccd5757fd (diff)
downloadqpdf-863d95e5676b0c03539c1cd9bacb31039d53b433.tar.zst
Add new method QPDFTokenizer::nextToken
Diffstat (limited to 'libqpdf/QPDFTokenizer.cc')
-rw-r--r--libqpdf/QPDFTokenizer.cc64
1 files changed, 39 insertions, 25 deletions
diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc
index b828691c..fe36d768 100644
--- a/libqpdf/QPDFTokenizer.cc
+++ b/libqpdf/QPDFTokenizer.cc
@@ -805,7 +805,9 @@ QPDFTokenizer::presentEOF()
void
QPDFTokenizer::expectInlineImage(std::shared_ptr<InputSource> input)
{
- if (this->state != st_before_token) {
+ if (this->state == st_token_ready) {
+ reset();
+ } else if (this->state != st_before_token) {
throw std::logic_error("QPDFTokenizer::expectInlineImage called"
" when tokenizer is in improper state");
}
@@ -941,11 +943,40 @@ QPDFTokenizer::readToken(
bool allow_bad,
size_t max_len)
{
- qpdf_offset_t offset = input->fastTell();
+ nextToken(*input, context, max_len);
+
+ Token token;
+ bool unread_char;
+ char char_to_unread;
+ getToken(token, unread_char, char_to_unread);
+
+ if (token.getType() == tt_bad) {
+ if (allow_bad) {
+ QTC::TC("qpdf", "QPDFTokenizer allowing bad token");
+ } else {
+ throw QPDFExc(
+ qpdf_e_damaged_pdf,
+ input->getName(),
+ context,
+ input->getLastOffset(),
+ token.getErrorMessage());
+ }
+ }
+ return token;
+}
+
+bool
+QPDFTokenizer::nextToken(
+ InputSource& input, std::string const& context, size_t max_len)
+{
+ if (this->state != st_inline_image) {
+ reset();
+ }
+ qpdf_offset_t offset = input.fastTell();
while (this->state != st_token_ready) {
char ch;
- if (!input->fastRead(ch)) {
+ if (!input.fastRead(ch)) {
presentEOF();
if ((this->type == tt_eof) && (!this->allow_eof)) {
@@ -954,7 +985,7 @@ QPDFTokenizer::readToken(
// exercised.
this->type = tt_bad;
this->error_message = "unexpected EOF";
- offset = input->getLastOffset();
+ offset = input.getLastOffset();
}
} else {
handleCharacter(ch);
@@ -976,28 +1007,11 @@ QPDFTokenizer::readToken(
}
}
- Token token;
- bool unread_char;
- char char_to_unread;
- getToken(token, unread_char, char_to_unread);
- input->fastUnread(unread_char);
-
- if (token.getType() != tt_eof) {
- input->setLastOffset(offset);
- }
+ input.fastUnread(!this->in_token && !this->before_token);
- if (token.getType() == tt_bad) {
- if (allow_bad) {
- QTC::TC("qpdf", "QPDFTokenizer allowing bad token");
- } else {
- throw QPDFExc(
- qpdf_e_damaged_pdf,
- input->getName(),
- context,
- offset,
- token.getErrorMessage());
- }
+ if (this->type != tt_eof) {
+ input.setLastOffset(offset);
}
- return token;
+ return this->error_message.empty();
}