aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2022-08-19 14:04:11 +0200
committerm-holger <m-holger@kubitscheck.org>2022-08-21 12:01:48 +0200
commitf29d0a63121f1243b80c74d90c59a8a88f0a9223 (patch)
tree9fab8a6b20a5a451d0f31b73efacc91da794f3cc /libqpdf
parentd26b537a7c65b4aa9ed4c632bfb9eaf921fbbd2d (diff)
downloadqpdf-f29d0a63121f1243b80c74d90c59a8a88f0a9223.tar.zst
Add state st_char_code in QPDFTokenizer
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFTokenizer.cc53
1 files changed, 31 insertions, 22 deletions
diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc
index 5127a90d..b070294e 100644
--- a/libqpdf/QPDFTokenizer.cc
+++ b/libqpdf/QPDFTokenizer.cc
@@ -330,6 +330,7 @@ QPDFTokenizer::handleCharacter(char ch)
this->state = st_token_ready;
return;
}
+
this->state = st_in_hexstring;
inHexstring(ch);
return;
@@ -355,20 +356,7 @@ QPDFTokenizer::handleCharacter(char ch)
if (this->string_ignoring_newline && (ch != '\n')) {
this->string_ignoring_newline = false;
}
-
- size_t bs_num_count = strlen(this->bs_num_register);
- bool ch_is_octal = ((ch >= '0') && (ch <= '7'));
- if ((bs_num_count == 3) || ((bs_num_count > 0) && (!ch_is_octal))) {
- // We've accumulated \ddd. PDF Spec says to ignore
- // high-order overflow.
- this->val += static_cast<char>(
- strtol(this->bs_num_register, nullptr, 8));
- memset(
- this->bs_num_register, '\0', sizeof(this->bs_num_register));
- bs_num_count = 0;
- }
-
- inString(ch, bs_num_count);
+ inString(ch);
this->last_char_was_cr =
((!this->string_ignoring_newline) && (ch == '\r'));
@@ -377,6 +365,10 @@ QPDFTokenizer::handleCharacter(char ch)
}
return;
+ case (st_char_code):
+ inCharCode(ch);
+ return;
+
case st_literal:
if (isDelimiter(ch)) {
// A C-locale whitespace character or delimiter terminates
@@ -452,15 +444,16 @@ QPDFTokenizer::inHexstring(char ch)
}
void
-QPDFTokenizer::inString(char ch, size_t bs_num_count)
+QPDFTokenizer::inString(char ch)
{
bool ch_is_octal = ((ch >= '0') && (ch <= '7'));
if (this->string_ignoring_newline && (ch == '\n')) {
// ignore
this->string_ignoring_newline = false;
return;
- } else if (ch_is_octal && (this->last_char_was_bs || (bs_num_count > 0))) {
- this->bs_num_register[bs_num_count++] = ch;
+ } else if (ch_is_octal && this->last_char_was_bs) {
+ this->state = st_char_code;
+ inCharCode(ch);
return;
} else if (this->last_char_was_bs) {
switch (ch) {
@@ -498,11 +491,6 @@ QPDFTokenizer::inString(char ch, size_t bs_num_count)
}
} else if (ch == '\\') {
// last_char_was_bs is set/cleared below as appropriate
- if (bs_num_count) {
- throw std::logic_error(
- "INTERNAL ERROR: QPDFTokenizer: bs_num_count != 0 "
- "when ch == '\\'");
- }
} else if (ch == '(') {
this->val += ch;
++this->string_depth;
@@ -528,6 +516,27 @@ QPDFTokenizer::inString(char ch, size_t bs_num_count)
}
void
+QPDFTokenizer::inCharCode(char ch)
+{
+ size_t bs_num_count = strlen(this->bs_num_register);
+ bool ch_is_octal = ((ch >= '0') && (ch <= '7'));
+ if ((bs_num_count == 3) || ((bs_num_count > 0) && (!ch_is_octal))) {
+ // We've accumulated \ddd. PDF Spec says to ignore
+ // high-order overflow.
+ this->val +=
+ static_cast<char>(strtol(this->bs_num_register, nullptr, 8));
+ memset(this->bs_num_register, '\0', sizeof(this->bs_num_register));
+ bs_num_count = 0;
+ this->state = st_in_string;
+ handleCharacter(ch);
+ return;
+ } else if (ch_is_octal) {
+ this->bs_num_register[bs_num_count++] = ch;
+ return;
+ }
+}
+
+void
QPDFTokenizer::presentEOF()
{
if (this->state == st_literal) {