aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFTokenizer.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2012-07-21 11:48:13 +0200
committerJay Berkenbilt <ejb@ql.org>2012-07-21 15:06:10 +0200
commitf3e267fce28c58039789379ba3488ad12c20a7f6 (patch)
tree3c941af787762825af91f19a4a9078d0a266da16 /libqpdf/QPDFTokenizer.cc
parent15eaed5c52c85dd97ce5bc829817c5535c527207 (diff)
downloadqpdf-f3e267fce28c58039789379ba3488ad12c20a7f6.tar.zst
Move readToken from QPDF to QPDFTokenizer
Diffstat (limited to 'libqpdf/QPDFTokenizer.cc')
-rw-r--r--libqpdf/QPDFTokenizer.cc49
1 files changed, 49 insertions, 0 deletions
diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc
index a60e8605..979a79bf 100644
--- a/libqpdf/QPDFTokenizer.cc
+++ b/libqpdf/QPDFTokenizer.cc
@@ -6,6 +6,7 @@
#include <qpdf/PCRE.hh>
#include <qpdf/QTC.hh>
+#include <qpdf/QPDFExc.hh>
#include <stdexcept>
#include <string.h>
@@ -15,6 +16,10 @@ static bool is_hex_digit(char ch)
{
return (strchr("0123456789abcdefABCDEF", ch) != 0);
}
+static bool is_space(char ch)
+{
+ return (strchr(" \f\n\r\t\v", ch) != 0);
+}
QPDFTokenizer::QPDFTokenizer() :
pound_special_in_name(true)
@@ -460,3 +465,47 @@ QPDFTokenizer::betweenTokens()
{
return ((state == st_top) || (state == st_in_comment));
}
+
+QPDFTokenizer::Token
+QPDFTokenizer::readToken(PointerHolder<InputSource> input,
+ std::string const& context)
+{
+ qpdf_offset_t offset = input->tell();
+ Token token;
+ bool unread_char;
+ char char_to_unread;
+ while (! getToken(token, unread_char, char_to_unread))
+ {
+ char ch;
+ if (input->read(&ch, 1) == 0)
+ {
+ throw QPDFExc(qpdf_e_damaged_pdf, input->getName(),
+ context, offset,
+ "EOF while reading token");
+ }
+ else
+ {
+ if (is_space((unsigned char)ch) &&
+ (input->getLastOffset() == offset))
+ {
+ ++offset;
+ }
+ presentCharacter(ch);
+ }
+ }
+
+ if (unread_char)
+ {
+ input->unreadCh(char_to_unread);
+ }
+
+ if (token.getType() == tt_bad)
+ {
+ throw QPDFExc(qpdf_e_damaged_pdf, input->getName(),
+ context, offset, token.getErrorMessage());
+ }
+
+ input->setLastOffset(offset);
+
+ return token;
+}