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:
parent
2dd6824e76
commit
66359a0f56
4 changed files with 28 additions and 3 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
}
|
||||||
|
|
2
tests/fixtures/sort/no_trailing_newline1.txt
vendored
Normal file
2
tests/fixtures/sort/no_trailing_newline1.txt
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
a
|
||||||
|
b
|
1
tests/fixtures/sort/no_trailing_newline2.txt
vendored
Normal file
1
tests/fixtures/sort/no_trailing_newline2.txt
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
b
|
Loading…
Add table
Add a link
Reference in a new issue