Commit 4783b223121d4f1133f0bb14dfd62833d7348a07

Authored by m-holger
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;