Refactor CPDF_SimpleParser part 3 Remove the size variable, which is usually just `cur_pos_ - start_pos`. Handle special cases accordingly. Avoid stepping back the current position. Instead, prefer processing the current character before incrementing the position. This makes the logic easier to follow and makes the size easier to understand. Also update a double negative conditional to use positive instead. Change-Id: I2b8a9bccd8b4e8b7c3ccb260ff46e898d2965328 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/123412 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Andy Phan <andyphan@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_simple_parser.cpp b/core/fpdfapi/parser/cpdf_simple_parser.cpp index 9856e2f..38c1bdb 100644 --- a/core/fpdfapi/parser/cpdf_simple_parser.cpp +++ b/core/fpdfapi/parser/cpdf_simple_parser.cpp
@@ -48,35 +48,29 @@ } } - uint8_t size = 0; uint32_t start_position = cur_position_ - 1; if (PDFCharIsDelimiter(cur_char)) { // Find names if (cur_char == '/') { - while (true) { - if (cur_position_ >= data_.size()) { - break; + while (cur_position_ < data_.size()) { + cur_char = data_[cur_position_]; + // Stop parsing after encountering a whitespace or delimiter. + if (PDFCharIsWhitespace(cur_char) || PDFCharIsDelimiter(cur_char)) { + return ByteStringView( + data_.subspan(start_position, cur_position_ - start_position)); } - - cur_char = data_[cur_position_++]; - if (!PDFCharIsOther(cur_char) && !PDFCharIsNumeric(cur_char)) { - cur_position_--; - size = cur_position_ - start_position; - break; - } + ++cur_position_; } - return ByteStringView(data_.subspan(start_position, size)); + return ByteStringView(); } - size = 1; if (cur_char == '<') { if (cur_position_ >= data_.size()) { - return ByteStringView(data_.subspan(start_position, size)); + return ByteStringView( + data_.subspan(start_position, cur_position_ - start_position)); } cur_char = data_[cur_position_++]; - if (cur_char == '<') { - size = 2; - } else { + if (cur_char != '<') { while (cur_position_ < data_.size() && data_[cur_position_] != '>') { cur_position_++; } @@ -84,18 +78,14 @@ if (cur_position_ < data_.size()) { cur_position_++; } - - size = cur_position_ - start_position; } } else if (cur_char == '>') { if (cur_position_ >= data_.size()) { - return ByteStringView(data_.subspan(start_position, size)); + return ByteStringView( + data_.subspan(start_position, cur_position_ - start_position)); } - cur_char = data_[cur_position_++]; - if (cur_char == '>') { - size = 2; - } else { - cur_position_--; + if (data_[cur_position_] == '>') { + ++cur_position_; } } else if (cur_char == '(') { int level = 1; @@ -124,21 +114,18 @@ if (cur_position_ < data_.size()) { cur_position_++; } - - size = cur_position_ - start_position; } - return ByteStringView(data_.subspan(start_position, size)); + return ByteStringView( + data_.subspan(start_position, cur_position_ - start_position)); } - size = 1; while (cur_position_ < data_.size()) { - cur_char = data_[cur_position_++]; - + cur_char = data_[cur_position_]; if (PDFCharIsDelimiter(cur_char) || PDFCharIsWhitespace(cur_char)) { - cur_position_--; break; } - size++; + ++cur_position_; } - return ByteStringView(data_.subspan(start_position, size)); + return ByteStringView( + data_.subspan(start_position, cur_position_ - start_position)); }