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 | 25 | case QPDFTokenizer::tt_space: |
| 26 | 26 | { |
| 27 | 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 | 49 | return; | ... | ... |