aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2022-09-29 15:33:11 +0200
committerJay Berkenbilt <jberkenbilt@users.noreply.github.com>2022-11-20 17:55:02 +0100
commit34a6f8938f0e6d55eeb9f37c0ef23e02fec88932 (patch)
tree0815d2e295f7a8e44d9e76ae8238db5c151bb683
parentdca70f13e77a5b20ba4f438350a67e48baa796d0 (diff)
downloadqpdf-34a6f8938f0e6d55eeb9f37c0ef23e02fec88932.tar.zst
Add methods QPDFTokenizer::Token::isWord
-rw-r--r--examples/pdf-filter-tokens.cc3
-rw-r--r--include/qpdf/QPDFTokenizer.hh10
-rw-r--r--libqpdf/Pl_QPDFTokenizer.cc4
-rw-r--r--libqpdf/QPDF.cc41
-rw-r--r--libqpdf/QPDFFormFieldObjectHelper.cc6
-rw-r--r--libqpdf/QPDFPageObjectHelper.cc8
-rw-r--r--libqpdf/QPDFTokenizer.cc2
-rw-r--r--libqpdf/QPDF_linearization.cc9
-rw-r--r--libtests/input_source.cc4
9 files changed, 39 insertions, 48 deletions
diff --git a/examples/pdf-filter-tokens.cc b/examples/pdf-filter-tokens.cc
index c9a71e64..a99ce70c 100644
--- a/examples/pdf-filter-tokens.cc
+++ b/examples/pdf-filter-tokens.cc
@@ -139,8 +139,7 @@ ColorToGray::handleToken(QPDFTokenizer::Token const& token)
QPDFTokenizer::token_type_e token_type = token.getType();
if (!isIgnorable(token_type)) {
this->stack.push_back(token);
- if ((this->stack.size() == 4) &&
- (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "rg")) &&
+ if ((this->stack.size() == 4) && token.isWord("rg") &&
(isNumeric(this->stack.at(0).getType())) &&
(isNumeric(this->stack.at(1).getType())) &&
(isNumeric(this->stack.at(2).getType()))) {
diff --git a/include/qpdf/QPDFTokenizer.hh b/include/qpdf/QPDFTokenizer.hh
index 3f5e5206..0fd34fb9 100644
--- a/include/qpdf/QPDFTokenizer.hh
+++ b/include/qpdf/QPDFTokenizer.hh
@@ -112,6 +112,16 @@ class QPDFTokenizer
{
return this->type == tt_integer;
}
+ bool
+ isWord() const
+ {
+ return this->type == tt_word;
+ }
+ bool
+ isWord(std::string const& value) const
+ {
+ return this->type == tt_word && this->value == value;
+ }
private:
token_type_e type;
diff --git a/libqpdf/Pl_QPDFTokenizer.cc b/libqpdf/Pl_QPDFTokenizer.cc
index 135d8318..5e42d579 100644
--- a/libqpdf/Pl_QPDFTokenizer.cc
+++ b/libqpdf/Pl_QPDFTokenizer.cc
@@ -53,9 +53,7 @@ Pl_QPDFTokenizer::finish()
this->m->filter->handleToken(token);
if (token.getType() == QPDFTokenizer::tt_eof) {
break;
- } else if (
- (token.getType() == QPDFTokenizer::tt_word) &&
- (token.getValue() == "ID")) {
+ } else if (token.isWord("ID")) {
// Read the space after the ID.
char ch = ' ';
input->read(&ch, 1);
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 34cefd2f..0000f050 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -459,13 +459,11 @@ QPDF::findHeader()
bool
QPDF::findStartxref()
{
- QPDFTokenizer::Token t = readToken(this->m->file);
- if (t == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "startxref")) {
- if (readToken(this->m->file).isInteger()) {
- // Position in front of offset token
- this->m->file->seek(this->m->file->getLastOffset(), SEEK_SET);
- return true;
- }
+ if (readToken(m->file).isWord("startxref") &&
+ readToken(m->file).isInteger()) {
+ // Position in front of offset token
+ this->m->file->seek(this->m->file->getLastOffset(), SEEK_SET);
+ return true;
}
return false;
}
@@ -613,16 +611,13 @@ QPDF::reconstruct_xref(QPDFExc& e)
// containing this token
} else if (t1.isInteger()) {
QPDFTokenizer::Token t2 = readToken(this->m->file, MAX_LEN);
- QPDFTokenizer::Token t3 = readToken(this->m->file, MAX_LEN);
if ((t2.isInteger()) &&
- (t3 == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "obj"))) {
+ (readToken(m->file, MAX_LEN).isWord("obj"))) {
int obj = QUtil::string_to_int(t1.getValue().c_str());
int gen = QUtil::string_to_int(t2.getValue().c_str());
insertXrefEntry(obj, 1, token_start, gen, true);
}
- } else if (
- (!this->m->trailer.isInitialized()) &&
- (t1 == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "trailer"))) {
+ } else if (!this->m->trailer.isInitialized() && t1.isWord("trailer")) {
QPDFObjectHandle t =
readObject(this->m->file, "trailer", QPDFObjGen(), false);
if (!t.isDictionary()) {
@@ -922,8 +917,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
}
}
qpdf_offset_t pos = this->m->file->tell();
- QPDFTokenizer::Token t = readToken(this->m->file);
- if (t == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "trailer")) {
+ if (readToken(m->file).isWord("trailer")) {
done = true;
} else {
this->m->file->seek(pos, SEEK_SET);
@@ -1431,8 +1425,7 @@ QPDF::readObject(
} else if (object.isDictionary() && (!in_object_stream)) {
// check for stream
qpdf_offset_t cur_offset = input->tell();
- if (readToken(input) ==
- QPDFTokenizer::Token(QPDFTokenizer::tt_word, "stream")) {
+ if (readToken(input).isWord("stream")) {
// The PDF specification states that the word "stream"
// should be followed by either a carriage return and
// a newline or by a newline alone. It specifically
@@ -1523,9 +1516,7 @@ QPDF::readObject(
// Seek in two steps to avoid potential integer overflow
input->seek(stream_offset, SEEK_SET);
input->seek(toO(length), SEEK_CUR);
- if (!(readToken(input) ==
- QPDFTokenizer::Token(
- QPDFTokenizer::tt_word, "endstream"))) {
+ if (!readToken(input).isWord("endstream")) {
QTC::TC("qpdf", "QPDF missing endstream");
throw damagedPDF(
input, input->getLastOffset(), "expected endstream");
@@ -1556,9 +1547,8 @@ bool
QPDF::findEndstream()
{
// Find endstream or endobj. Position the input at that token.
- QPDFTokenizer::Token t = readToken(this->m->file, 20);
- if ((t.getType() == QPDFTokenizer::tt_word) &&
- ((t.getValue() == "endobj") || (t.getValue() == "endstream"))) {
+ auto t = readToken(m->file, 20);
+ if (t.isWord("endobj") || t.isWord("endstream")) {
this->m->file->seek(this->m->file->getLastOffset(), SEEK_SET);
return true;
}
@@ -1682,8 +1672,8 @@ QPDF::readObjectAtOffset(
QPDFTokenizer::Token tobj = readToken(this->m->file);
bool objidok = tobjid.isInteger();
- int genok = tgen.isInteger();
- int objok = (tobj == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "obj"));
+ bool genok = tgen.isInteger();
+ bool objok = tobj.isWord("obj");
QTC::TC("qpdf", "QPDF check objid", objidok ? 1 : 0);
QTC::TC("qpdf", "QPDF check generation", genok ? 1 : 0);
@@ -1743,8 +1733,7 @@ QPDF::readObjectAtOffset(
QPDFObjectHandle oh = readObject(this->m->file, description, og, false);
- if (!(readToken(this->m->file) ==
- QPDFTokenizer::Token(QPDFTokenizer::tt_word, "endobj"))) {
+ if (!readToken(this->m->file).isWord("endobj")) {
QTC::TC("qpdf", "QPDF err expected endobj");
warn(damagedPDF("expected endobj"));
}
diff --git a/libqpdf/QPDFFormFieldObjectHelper.cc b/libqpdf/QPDFFormFieldObjectHelper.cc
index 0d405252..e76e3121 100644
--- a/libqpdf/QPDFFormFieldObjectHelper.cc
+++ b/libqpdf/QPDFFormFieldObjectHelper.cc
@@ -556,7 +556,7 @@ ValueSetter::handleToken(QPDFTokenizer::Token const& token)
switch (state) {
case st_top:
writeToken(token);
- if ((ttype == QPDFTokenizer::tt_word) && (value == "BMC")) {
+ if (token.isWord("BMC")) {
state = st_bmc;
}
break;
@@ -571,7 +571,7 @@ ValueSetter::handleToken(QPDFTokenizer::Token const& token)
// fall through to emc
case st_emc:
- if ((ttype == QPDFTokenizer::tt_word) && (value == "EMC")) {
+ if (token.isWord("EMC")) {
do_replace = true;
state = st_end;
}
@@ -751,7 +751,7 @@ TfFinder::handleToken(QPDFTokenizer::Token const& token)
break;
case QPDFTokenizer::tt_word:
- if (value == "Tf") {
+ if (token.isWord("Tf")) {
if ((last_num > 1.0) && (last_num < 1000.0)) {
// These ranges are arbitrary but keep us from doing
// insane things or suffering from over/underflow
diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc
index 761a16f4..089b62c5 100644
--- a/libqpdf/QPDFPageObjectHelper.cc
+++ b/libqpdf/QPDFPageObjectHelper.cc
@@ -210,18 +210,16 @@ InlineImageTracker::handleToken(QPDFTokenizer::Token const& token)
writeToken(token);
state = st_top;
}
- } else if (
- token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "ID")) {
+ } else if (token.isWord("ID")) {
bi_str += token.getValue();
dict_str += " >>";
- } else if (
- token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "EI")) {
+ } else if (token.isWord("EI")) {
state = st_top;
} else {
bi_str += token.getRawValue();
dict_str += token.getRawValue();
}
- } else if (token == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "BI")) {
+ } else if (token.isWord("BI")) {
bi_str = token.getValue();
dict_str = "<< ";
state = st_bi;
diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc
index cd8f932d..b11ff0fc 100644
--- a/libqpdf/QPDFTokenizer.cc
+++ b/libqpdf/QPDFTokenizer.cc
@@ -892,7 +892,7 @@ QPDFTokenizer::findEI(std::shared_ptr<InputSource> input)
okay = true;
} else if (type == tt_bad) {
found_bad = true;
- } else if (type == tt_word) {
+ } else if (t.isWord()) {
// The qpdf tokenizer lumps alphabetic and otherwise
// uncategorized characters into "words". We recognize
// strings of alphabetic characters as potential valid
diff --git a/libqpdf/QPDF_linearization.cc b/libqpdf/QPDF_linearization.cc
index 0c3cd185..6c001767 100644
--- a/libqpdf/QPDF_linearization.cc
+++ b/libqpdf/QPDF_linearization.cc
@@ -121,12 +121,9 @@ QPDF::isLinearized()
}
QPDFTokenizer::Token t1 = readToken(this->m->file);
- QPDFTokenizer::Token t2 = readToken(this->m->file);
- QPDFTokenizer::Token t3 = readToken(this->m->file);
- QPDFTokenizer::Token t4 = readToken(this->m->file);
- if (t1.isInteger() && t2.isInteger() &&
- (t3 == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "obj")) &&
- (t4.getType() == QPDFTokenizer::tt_dict_open)) {
+ if (t1.isInteger() && readToken(m->file).isInteger() &&
+ readToken(m->file).isWord("obj") &&
+ (readToken(m->file).getType() == QPDFTokenizer::tt_dict_open)) {
lindict_obj = toI(QUtil::string_to_ll(t1.getValue().c_str()));
}
}
diff --git a/libtests/input_source.cc b/libtests/input_source.cc
index 1b85beda..83744250 100644
--- a/libtests/input_source.cc
+++ b/libtests/input_source.cc
@@ -37,9 +37,9 @@ Finder::check()
{
QPDFTokenizer tokenizer;
QPDFTokenizer::Token t = tokenizer.readToken(is, "finder", true);
- if (t == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "potato")) {
+ if (t.isWord("potato")) {
t = tokenizer.readToken(is, "finder", true);
- return (t == QPDFTokenizer::Token(QPDFTokenizer::tt_word, after));
+ return t.isWord(after);
}
return false;
}