[split-file] Respect input file's line endings

This change adds support for split-file to respect the line ending style
of the input file. This enables split-file to work as expected on
Windows with input files containing CRLF line endings.

The test files added along with this change mirror the existing basic
tests, but are forced to contain CRLF line endings via git attributes.
This will result in the tests always containing CRLF line endings when
checked out regardless of the user's OS.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D117897
This commit is contained in:
Chris Bieneman 2022-01-21 10:47:15 -06:00
parent 08574ce4d6
commit 13fa17db3a
5 changed files with 20 additions and 1 deletions

2
llvm/.gitattributes vendored
View File

@ -25,3 +25,5 @@ test/tools/llvm-mca/X86/directives-handle-crlf.s text eol=crlf
test/tools/llvm-strings/radix.test text eol=lf
test/tools/split-file/basic.test text eol=lf
test/tools/split-file/Inputs/basic-*.txt eol=lf
test/tools/split-file/basic.crlf.test text eol=crlf
test/tools/split-file/Inputs/basic-*.crlf eol=crlf

View File

@ -0,0 +1,2 @@
aa

View File

@ -0,0 +1,4 @@
bb

View File

@ -0,0 +1,10 @@
#--- aa
aa
;--- bb
bb
;--- end
# RUN: rm -rf %t
# RUN: split-file --leading-lines %s %t
# RUN: diff %S/Inputs/basic-aa.crlf %t/aa
# RUN: diff %S/Inputs/basic-bb.crlf %t/bb

View File

@ -71,6 +71,7 @@ struct Part {
static int handle(MemoryBuffer &inputBuf, StringRef input) {
DenseMap<StringRef, Part> partToBegin;
StringRef lastPart, separator;
StringRef EOL = inputBuf.getBuffer().detectEOL();
for (line_iterator i(inputBuf, /*SkipBlanks=*/false, '\0'); !i.is_at_eof();) {
const int64_t lineNo = i.line_number();
const StringRef line = *i++;
@ -128,7 +129,7 @@ static int handle(MemoryBuffer &inputBuf, StringRef input) {
Part &part = keyValue.second;
for (int64_t i = 0; i != part.leadingLines; ++i)
(*f).os().write('\n');
(*f).os() << EOL;
if (part.begin)
(*f).os().write(part.begin, part.end - part.begin);
outputFiles.push_back(std::move(f));