From 1d43bfc598b66dd01e9db9ca9854ffc4bc756a56 Mon Sep 17 00:00:00 2001 From: Kemal Zebari Date: Wed, 17 Jan 2024 16:02:52 -0800 Subject: [PATCH] base64: Implement -w/--wrap This is an option supported by coreutils, so we might as well support it too. It allows users to wrap their encoded output after the "column" value they provide. This commit also has the Markdown look more like what we see when running ArgsParser::print_usage_markdown() (and it fixes some of the examples). --- Base/usr/share/man/man1/base64.md | 11 +++++++---- Userland/Utilities/base64.cpp | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Base/usr/share/man/man1/base64.md b/Base/usr/share/man/man1/base64.md index 7d1bff291e8..c02df51df91 100644 --- a/Base/usr/share/man/man1/base64.md +++ b/Base/usr/share/man/man1/base64.md @@ -5,7 +5,7 @@ base64 - encode and decode to base64 ## Synopsis ```**sh -$ base64 [-d|--decode] [file] +$ base64 [--decode] [--wrap column] [file] ``` ## Description @@ -15,15 +15,18 @@ file is not specified or file is `-`. ## Options -* `-d|--decode`: Decode data +* `-d`, `--decode`: Decode data +* `-w column`, `--wrap column`: When encoding, wrap output after `column` characters ## Examples ```sh -# base64 encode the text 'foo' +# base64 encode the text 'A' $ echo 'A' | base64 -# base64 encode the content of foo.txt +# base64 encode the content of hi.txt $ base64 hi.txt +# base64 encode the content of baz.txt and wrap after 4 columns +$ base64 -w 4 baz.txt # base64 decode the text 'Zm9v' $ echo 'Zm9v' | base64 -d # base64 decode the content of foo.txt diff --git a/Userland/Utilities/base64.cpp b/Userland/Utilities/base64.cpp index fd07bf310eb..2ff1ed7cdb1 100644 --- a/Userland/Utilities/base64.cpp +++ b/Userland/Utilities/base64.cpp @@ -10,15 +10,29 @@ #include #include +static void print_wrapped_output(size_t column, StringView encoded) +{ + VERIFY(column > 0); + + while (!encoded.is_empty()) { + auto segment_length = min(column, encoded.length()); + + outln("{}", encoded.substring_view(0, segment_length)); + encoded = encoded.substring_view(segment_length); + } +} + ErrorOr serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio rpath")); bool decode = false; + Optional maybe_column; StringView filepath = {}; Core::ArgsParser args_parser; args_parser.add_option(decode, "Decode data", "decode", 'd'); + args_parser.add_option(maybe_column, "When encoding, wrap output after column characters", "wrap", 'w', "column"); args_parser.add_positional_argument(filepath, "", "file", Core::ArgsParser::Required::No); args_parser.parse(arguments); @@ -34,6 +48,12 @@ ErrorOr serenity_main(Main::Arguments arguments) } auto encoded = TRY(encode_base64(buffer)); + + if (maybe_column.has_value() && *maybe_column > 0) { + print_wrapped_output(*maybe_column, encoded); + return 0; + } + outln("{}", encoded); return 0; }