1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 03:27:44 +00:00

sort: insert line separators after non-empty files

If files don't end witht a line separator we have to insert one,
otherwise the last line will be combined with the first line of the next
file.
This commit is contained in:
Michael Debertol 2021-06-06 11:31:42 +02:00
parent 2dd6824e76
commit 66359a0f56
4 changed files with 28 additions and 3 deletions

View file

@ -175,6 +175,7 @@ fn read_to_buffer(
separator: u8, separator: u8,
) -> (usize, bool) { ) -> (usize, bool) {
let mut read_target = &mut buffer[start_offset..]; let mut read_target = &mut buffer[start_offset..];
let mut last_file_target_size = read_target.len();
loop { loop {
match file.read(read_target) { match file.read(read_target) {
Ok(0) => { Ok(0) => {
@ -208,14 +209,27 @@ fn read_to_buffer(
read_target = &mut buffer[len..]; read_target = &mut buffer[len..];
} }
} else { } else {
// This file is empty. // This file has been fully read.
let mut leftover_len = read_target.len();
if last_file_target_size != leftover_len {
// The file was not empty.
let read_len = buffer.len() - leftover_len;
if buffer[read_len - 1] != separator {
// The file did not end with a separator. We have to insert one.
buffer[read_len] = separator;
leftover_len -= 1;
}
let read_len = buffer.len() - leftover_len;
read_target = &mut buffer[read_len..];
}
if let Some(next_file) = next_files.next() { if let Some(next_file) = next_files.next() {
// There is another file. // There is another file.
last_file_target_size = leftover_len;
*file = next_file; *file = next_file;
} else { } else {
// This was the last file. // This was the last file.
let leftover_len = read_target.len(); let read_len = buffer.len() - leftover_len;
return (buffer.len() - leftover_len, false); return (read_len, false);
} }
} }
} }

View file

@ -792,3 +792,11 @@ fn test_nonexistent_file() {
fn test_blanks() { fn test_blanks() {
test_helper("blanks", &["-b", "--ignore-blanks"]); test_helper("blanks", &["-b", "--ignore-blanks"]);
} }
#[test]
fn sort_multiple() {
new_ucmd!()
.args(&["no_trailing_newline1.txt", "no_trailing_newline2.txt"])
.succeeds()
.stdout_is("a\nb\nb\n");
}

View file

@ -0,0 +1,2 @@
a
b

View file

@ -0,0 +1 @@
b