sort: do not search previously-read characters for newlines

This commit is contained in:
Jacob Greenfield 2025-09-25 19:57:10 -04:00 committed by Sylvestre Ledru
parent b6f4243fa7
commit 72b70a9387

View file

@ -260,6 +260,8 @@ fn read_to_buffer<T: Read>(
) -> UResult<(usize, bool)> {
let mut read_target = &mut buffer[start_offset..];
let mut last_file_empty = true;
let mut newline_search_offset = 0;
let mut found_newline = false;
loop {
match file.read(read_target) {
Ok(0) => {
@ -278,13 +280,17 @@ fn read_to_buffer<T: Read>(
continue;
}
}
let mut sep_iter = memchr_iter(separator, buffer).rev();
let last_line_end = sep_iter.next();
if sep_iter.next().is_some() {
// We read enough lines.
let end = last_line_end.unwrap();
// We want to include the separator here, because it shouldn't be carried over.
return Ok((end + 1, true));
let mut sep_iter =
memchr_iter(separator, &buffer[newline_search_offset..buffer.len()]).rev();
newline_search_offset = buffer.len();
if let Some(last_line_end) = sep_iter.next() {
if found_newline || sep_iter.next().is_some() {
// We read enough lines.
// We want to include the separator here, because it shouldn't be carried over.
return Ok((last_line_end + 1, true));
}
found_newline = true;
}
// We need to read more lines