Commit 211a7f57be1913a32239b9868c85f18cd6b28683

Authored by Jay Berkenbilt
1 parent 9a398504

QUtil::read_lines_from_file: optional EOL preservation

ChangeLog
  1 +2020-01-13 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * QUtil::read_lines_from_file: add new versions that use FILE*,
  4 + use FILE* instead if std::ifstream internally to support correct
  5 + handling of Unicode filenames in Windows, and add the option to
  6 + preserve line endings.
  7 +
1 8 2019-11-17 Jay Berkenbilt <ejb@ql.org>
2 9  
3 10 * 9.1.0: release
... ...
libqpdf/QUtil.cc
... ... @@ -1116,11 +1116,18 @@ QUtil::read_lines_from_file(std::function&lt;bool(char&amp;)&gt; next_char,
1116 1116 }
1117 1117 if (c == '\n')
1118 1118 {
1119   - // Remove any carriage return that preceded the
1120   - // newline and discard the newline
1121   - if ((! buf->empty()) && ((*(buf->rbegin())) == '\r'))
  1119 + if (preserve_eol)
1122 1120 {
1123   - buf->erase(buf->length() - 1);
  1121 + buf->append(1, c);
  1122 + }
  1123 + else
  1124 + {
  1125 + // Remove any carriage return that preceded the
  1126 + // newline and discard the newline
  1127 + if ((! buf->empty()) && ((*(buf->rbegin())) == '\r'))
  1128 + {
  1129 + buf->erase(buf->length() - 1);
  1130 + }
1124 1131 }
1125 1132 buf = 0;
1126 1133 }
... ...
libtests/qutil.cc
... ... @@ -418,6 +418,31 @@ void read_from_file_test()
418 418 fclose(fp);
419 419 }
420 420  
  421 + // Test with EOL preservation
  422 + std::list<std::string> lines2 =
  423 + QUtil::read_lines_from_file("other-file", true);
  424 + auto line = lines2.begin();
  425 + assert(37 == (*line).length());
  426 + assert('.' == (*line).at(35));
  427 + assert('\n' == (*line).at(36));
  428 + ++line;
  429 + assert(24 == (*line).length());
  430 + assert('.' == (*line).at(21));
  431 + assert('\r' == (*line).at(22));
  432 + assert('\n' == (*line).at(23));
  433 + ++line;
  434 + assert(24591 == (*line).length());
  435 + assert('.' == (*line).at(24589));
  436 + assert('\n' == (*line).at(24590));
  437 + // Test the other versions and make sure we get the same results
  438 + {
  439 + std::ifstream infs("other-file", std::ios_base::binary);
  440 + assert(QUtil::read_lines_from_file(infs, true) == lines2);
  441 + FILE* fp = QUtil::safe_fopen("other-file", "rb");
  442 + assert(QUtil::read_lines_from_file(fp, true) == lines2);
  443 + fclose(fp);
  444 + }
  445 +
421 446 PointerHolder<char> buf;
422 447 size_t size = 0;
423 448 QUtil::read_file_into_memory("other-file", buf, size);
... ...