Commit 4783b223121d4f1133f0bb14dfd62833d7348a07
1 parent
ffe462e6
In ContentNormalizer::handleToken refactor handling of space tokens
Avoid writing each space char individually.
Showing
1 changed file
with
18 additions
and
11 deletions
libqpdf/ContentNormalizer.cc
| @@ -25,18 +25,25 @@ ContentNormalizer::handleToken(QPDFTokenizer::Token const& token) | @@ -25,18 +25,25 @@ ContentNormalizer::handleToken(QPDFTokenizer::Token const& token) | ||
| 25 | case QPDFTokenizer::tt_space: | 25 | case QPDFTokenizer::tt_space: |
| 26 | { | 26 | { |
| 27 | std::string const& value = token.getRawValue(); | 27 | std::string const& value = token.getRawValue(); |
| 28 | - size_t len = value.length(); | ||
| 29 | - for (size_t i = 0; i < len; ++i) { | ||
| 30 | - char ch = value.at(i); | ||
| 31 | - if (ch == '\r') { | ||
| 32 | - if ((i + 1 < len) && (value.at(i + 1) == '\n')) { | ||
| 33 | - // ignore | ||
| 34 | - } else { | ||
| 35 | - write("\n"); | ||
| 36 | - } | ||
| 37 | - } else { | ||
| 38 | - write(&ch, 1); | 28 | + auto size = value.size(); |
| 29 | + size_t pos = 0; | ||
| 30 | + auto r_pos = value.find('\r'); | ||
| 31 | + while (r_pos != std::string::npos) { | ||
| 32 | + if (pos != r_pos) { | ||
| 33 | + write(&value[pos], r_pos - pos); | ||
| 39 | } | 34 | } |
| 35 | + if (++r_pos >= size) { | ||
| 36 | + write("\n"); | ||
| 37 | + return; | ||
| 38 | + } | ||
| 39 | + if (value[r_pos] != '\n') { | ||
| 40 | + write("\n"); | ||
| 41 | + } | ||
| 42 | + pos = r_pos; | ||
| 43 | + r_pos = value.find('\r', pos); | ||
| 44 | + } | ||
| 45 | + if (pos < size) { | ||
| 46 | + write(&value[pos], size - pos); | ||
| 40 | } | 47 | } |
| 41 | } | 48 | } |
| 42 | return; | 49 | return; |