From a07d2b4190bc0db778a254733dac88dccd5757fd Mon Sep 17 00:00:00 2001 From: m-holger Date: Tue, 4 Oct 2022 22:37:23 +0100 Subject: [PATCH] Only build QPDFTokenizer::val for name and string tokens For all other token types val and raw_val are identical. --- libqpdf/QPDFTokenizer.cc | 41 ++++------------------------------------ 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc index b11ff0fc..b828691c 100644 --- a/libqpdf/QPDFTokenizer.cc +++ b/libqpdf/QPDFTokenizer.cc @@ -261,15 +261,11 @@ QPDFTokenizer::inBeforeToken(char ch) this->in_token = this->include_ignorable; if (this->include_ignorable) { this->state = st_in_space; - this->val += ch; } } else if (ch == '%') { this->before_token = !this->include_ignorable; this->in_token = this->include_ignorable; this->state = st_in_comment; - if (this->include_ignorable) { - this->val += ch; - } } else { this->before_token = false; this->in_token = true; @@ -298,32 +294,27 @@ QPDFTokenizer::inTop(char ch) this->type = tt_bad; QTC::TC("qpdf", "QPDFTokenizer bad )"); this->error_message = "unexpected )"; - this->val += ch; this->state = st_token_ready; return; case '[': this->type = tt_array_open; this->state = st_token_ready; - this->val += ch; return; case ']': this->type = tt_array_close; - this->val += ch; this->state = st_token_ready; return; case '{': this->type = tt_brace_open; this->state = st_token_ready; - this->val += ch; return; case '}': this->type = tt_brace_close; this->state = st_token_ready; - this->val += ch; return; case '/': @@ -342,23 +333,19 @@ QPDFTokenizer::inTop(char ch) case '8': case '9': this->state = st_number; - this->val += ch; return; case '+': case '-': this->state = st_sign; - this->val += ch; return; case '.': this->state = st_decimal; - this->val += ch; return; default: this->state = st_literal; - this->val += ch; return; } } @@ -372,10 +359,6 @@ QPDFTokenizer::inSpace(char ch) this->in_token = false; this->char_to_unread = ch; this->state = st_token_ready; - return; - } else { - this->val += ch; - return; } } @@ -391,8 +374,6 @@ QPDFTokenizer::inComment(char ch) } else { this->state = st_before_token; } - } else if (this->include_ignorable) { - this->val += ch; } } @@ -527,10 +508,8 @@ QPDFTokenizer::inSign(char ch) { if (QUtil::is_digit(ch)) { this->state = st_number; - this->val += ch; } else if (ch == '.') { this->state = st_decimal; - this->val += ch; } else { this->state = st_literal; inLiteral(ch); @@ -542,7 +521,6 @@ QPDFTokenizer::inDecimal(char ch) { if (QUtil::is_digit(ch)) { this->state = st_real; - this->val += ch; } else { this->state = st_literal; inLiteral(ch); @@ -553,10 +531,8 @@ void QPDFTokenizer::inNumber(char ch) { if (QUtil::is_digit(ch)) { - this->val += ch; } else if (ch == '.') { this->state = st_real; - this->val += ch; } else if (isDelimiter(ch)) { this->type = tt_integer; this->state = st_token_ready; @@ -564,7 +540,6 @@ QPDFTokenizer::inNumber(char ch) this->char_to_unread = ch; } else { this->state = st_literal; - this->val += ch; } } @@ -572,7 +547,6 @@ void QPDFTokenizer::inReal(char ch) { if (QUtil::is_digit(ch)) { - this->val += ch; } else if (isDelimiter(ch)) { this->type = tt_real; this->state = st_token_ready; @@ -580,7 +554,6 @@ QPDFTokenizer::inReal(char ch) this->char_to_unread = ch; } else { this->state = st_literal; - this->val += ch; } } void @@ -649,7 +622,6 @@ void QPDFTokenizer::inLt(char ch) { if (ch == '<') { - this->val += "<<"; this->type = tt_dict_open; this->state = st_token_ready; return; @@ -663,11 +635,9 @@ void QPDFTokenizer::inGt(char ch) { if (ch == '>') { - this->val += ">>"; this->type = tt_dict_close; this->state = st_token_ready; } else { - this->val += ">"; this->type = tt_bad; QTC::TC("qpdf", "QPDFTokenizer bad >"); this->error_message = "unexpected >"; @@ -692,11 +662,9 @@ QPDFTokenizer::inLiteral(char ch) this->in_token = false; this->char_to_unread = ch; this->state = st_token_ready; - this->type = (this->val == "true") || (this->val == "false") + this->type = (this->raw_val == "true") || (this->raw_val == "false") ? tt_bool - : (this->val == "null" ? tt_null : tt_word); - } else { - this->val += ch; + : (this->raw_val == "null" ? tt_null : tt_word); } } @@ -783,8 +751,7 @@ QPDFTokenizer::inCharCode(char ch) void QPDFTokenizer::inInlineImage(char ch) { - this->val += ch; - if (this->val.length() == this->inline_image_bytes) { + if ((this->raw_val.length() + 1) == this->inline_image_bytes) { QTC::TC("qpdf", "QPDFTokenizer found EI by byte count"); this->type = tt_inline_image; this->inline_image_bytes = 0; @@ -951,7 +918,7 @@ QPDFTokenizer::getToken(Token& token, bool& unread_char, char& ch) unread_char = !this->in_token && !this->before_token; ch = this->char_to_unread; if (ready) { - token = (this->type == tt_bad) + token = (!(this->type == tt_name || this->type == tt_string)) ? Token( this->type, this->raw_val, this->raw_val, this->error_message) : Token(this->type, this->val, this->raw_val, this->error_message);