1
0
mirror of https://github.com/SerenityOS/serenity synced 2024-07-09 08:37:24 +00:00

comm: Support reading arbitrarily long lines

This commit is contained in:
Tim Ledbetter 2024-05-13 07:06:43 +01:00 committed by Nico Weber
parent 9f0ab281ce
commit 4663b2fee6

View File

@ -113,27 +113,27 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
int col3_count { 0 }; int col3_count { 0 };
ByteString file1_line; ByteString file1_line;
ByteString file2_line; ByteString file2_line;
Array<u8, PAGE_SIZE> buffer; auto buffer = TRY(ByteBuffer::create_uninitialized(PAGE_SIZE));
auto should_continue_comparing_files = [&]() { auto should_continue_comparing_files = [&]() {
if (read_file1) { if (read_file1 && file1->is_eof())
auto can_read_file1_line = file1->can_read_line(); return false;
if (can_read_file1_line.is_error() || !can_read_file1_line.value()) if (read_file2 && file2->is_eof())
return false; return false;
}
if (read_file2) {
auto can_read_file2_line = file2->can_read_line();
if (can_read_file2_line.is_error() || !can_read_file2_line.value())
return false;
}
return true; return true;
}; };
while (should_continue_comparing_files()) { while (should_continue_comparing_files()) {
if (read_file1) if (read_file1) {
file1_line = TRY(file1->read_line(buffer)); file1_line = TRY(file1->read_line_with_resize(buffer));
if (read_file2) if (file1_line.is_empty() && file1->is_eof())
file2_line = TRY(file2->read_line(buffer)); break;
}
if (read_file2) {
file2_line = TRY(file2->read_line_with_resize(buffer));
if (file2_line.is_empty() && file2->is_eof())
break;
}
int cmp_result = cmp(file1_line, file2_line); int cmp_result = cmp(file1_line, file2_line);
@ -168,13 +168,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
} }
auto process_remaining = [&](ByteString const& fmt, auto& file, int& count, bool print) { auto process_remaining = [&](ByteString const& fmt, auto& file, int& count, bool print) {
while (true) { while (!file->is_eof()) {
auto can_read_result = file->can_read_line();
if (can_read_result.is_error() || !can_read_result.value())
break;
++count; ++count;
auto line = file->read_line(buffer); auto line = file->read_line_with_resize(buffer);
if (line.is_error()) if (line.is_error() || (line.value().is_empty() && file->is_eof()))
break; break;
if (print) if (print)
outln(fmt, line.value()); outln(fmt, line.value());