diff --git a/Userland/Utilities/tac.cpp b/Userland/Utilities/tac.cpp index 8e13f37439..9541ea2e74 100644 --- a/Userland/Utilities/tac.cpp +++ b/Userland/Utilities/tac.cpp @@ -8,7 +8,6 @@ #include #include #include - int main(int argc, char** argv) { if (pledge("stdio rpath", nullptr) < 0) { @@ -16,32 +15,41 @@ int main(int argc, char** argv) return 1; } - const char* path = nullptr; + Vector paths; + Core::ArgsParser args_parser; args_parser.set_general_help("Concatenate files or pipes to stdout, last line first."); - args_parser.add_positional_argument(path, "File path", "path", Core::ArgsParser::Required::No); + args_parser.add_positional_argument(paths, "File path(s)", "path", Core::ArgsParser::Required::No); args_parser.parse(argc, argv); - RefPtr file; - if (path == nullptr) { - file = Core::File::standard_input(); - } else { - auto file_or_error = Core::File::open(path, Core::File::ReadOnly); - if (file_or_error.is_error()) { - warnln("Failed to open {}: {}", path, file_or_error.error()); - return 1; + auto read_lines = [&](RefPtr file) { + Vector lines; + while (file->can_read_line()) { + lines.append(file->read_line()); } - file = file_or_error.value(); - } + file->close(); + for (int i = lines.size() - 1; i >= 0; --i) + outln("{}", lines[i]); + }; - Vector lines; - while (file->can_read_line()) { - auto line = file->read_line(); - lines.append(line); + if (!paths.is_empty()) { + for (auto const& path : paths) { + RefPtr file; + if (path == "-") { + file = Core::File::standard_input(); + } else { + auto file_or_error = Core::File::open(path, Core::File::ReadOnly); + if (file_or_error.is_error()) { + warnln("Failed to open {}: {}", path, strerror(errno)); + continue; + } + file = file_or_error.release_value(); + } + read_lines(file); + } + } else { + read_lines(Core::File::standard_input()); } - for (int i = lines.size() - 1; i >= 0; --i) - outln("{}", lines[i]); - return 0; }