From 897a7060757a0aba4e70b67d53a5c4b0e4c5f9ac Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Tue, 6 Jul 2021 20:53:17 +0200 Subject: [PATCH] Utilities: Add support for -d flag to tr --- Userland/Utilities/tr.cpp | 43 ++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/Userland/Utilities/tr.cpp b/Userland/Utilities/tr.cpp index 27a4cf1f80..f228fa6d11 100644 --- a/Userland/Utilities/tr.cpp +++ b/Userland/Utilities/tr.cpp @@ -12,26 +12,45 @@ int main(int argc, char** argv) { + bool delete_flag = false; const char* from_chars = nullptr; const char* to_chars = nullptr; Core::ArgsParser args_parser; + args_parser.add_option(delete_flag, "Delete characters instead of replacing", nullptr, 'd'); args_parser.add_positional_argument(from_chars, "Character to translate from", "from"); - args_parser.add_positional_argument(to_chars, "Character to translate to", "to"); + args_parser.add_positional_argument(to_chars, "Character to translate to", "to", Core::ArgsParser::Required::No); args_parser.parse(argc, argv); - // TODO: Support multiple characters to translate from and to - auto from = from_chars[0]; - auto to = to_chars[0]; + if (!to_chars && !delete_flag) { + args_parser.print_usage(stderr, argv[0]); + return 1; + } - for (;;) { - char ch = fgetc(stdin); - if (feof(stdin)) - break; - if (ch == from) - putchar(to); - else - putchar(ch); + if (delete_flag) { + auto from_str = AK::StringView(from_chars); + + for (;;) { + char ch = fgetc(stdin); + if (feof(stdin)) + break; + if (!from_str.contains(ch)) + putchar(ch); + } + } else { + // TODO: Support multiple characters to translate from and to + auto from = from_chars[0]; + auto to = to_chars[0]; + + for (;;) { + char ch = fgetc(stdin); + if (feof(stdin)) + break; + if (ch == from) + putchar(to); + else + putchar(ch); + } } return 0;