From 7db3e962f340c811dd734fb733e22980d7a5e5d4 Mon Sep 17 00:00:00 2001 From: Aziz Berkay Yesilyurt Date: Tue, 6 Jul 2021 18:18:10 +0200 Subject: [PATCH] LibCore: Add unsigned option to ArgsParser Unsigned options are used to return underflowed values for negative inputs. With this change, we can verify that unsigned options only accept unsigned inputs as arguments. --- Userland/Libraries/LibCore/ArgsParser.cpp | 33 +++++++++++++++++++++++ Userland/Libraries/LibCore/ArgsParser.h | 2 ++ 2 files changed, 35 insertions(+) diff --git a/Userland/Libraries/LibCore/ArgsParser.cpp b/Userland/Libraries/LibCore/ArgsParser.cpp index c858bea4f0..96fac2dceb 100644 --- a/Userland/Libraries/LibCore/ArgsParser.cpp +++ b/Userland/Libraries/LibCore/ArgsParser.cpp @@ -322,6 +322,23 @@ void ArgsParser::add_option(int& value, const char* help_string, const char* lon add_option(move(option)); } +void ArgsParser::add_option(unsigned& value, const char* help_string, const char* long_name, char short_name, const char* value_name) +{ + Option option { + true, + help_string, + long_name, + short_name, + value_name, + [&value](const char* s) { + auto opt = StringView(s).to_uint(); + value = opt.value_or(0); + return opt.has_value(); + } + }; + add_option(move(option)); +} + void ArgsParser::add_option(double& value, const char* help_string, const char* long_name, char short_name, const char* value_name) { Option option { @@ -405,6 +422,22 @@ void ArgsParser::add_positional_argument(int& value, const char* help_string, co add_positional_argument(move(arg)); } +void ArgsParser::add_positional_argument(unsigned& value, const char* help_string, const char* name, Required required) +{ + Arg arg { + help_string, + name, + required == Required::Yes ? 1 : 0, + 1, + [&value](const char* s) { + auto opt = StringView(s).to_uint(); + value = opt.value_or(0); + return opt.has_value(); + } + }; + add_positional_argument(move(arg)); +} + void ArgsParser::add_positional_argument(double& value, const char* help_string, const char* name, Required required) { Arg arg { diff --git a/Userland/Libraries/LibCore/ArgsParser.h b/Userland/Libraries/LibCore/ArgsParser.h index 42a082ece8..66c0493efe 100644 --- a/Userland/Libraries/LibCore/ArgsParser.h +++ b/Userland/Libraries/LibCore/ArgsParser.h @@ -65,6 +65,7 @@ public: void add_option(String& value, const char* help_string, const char* long_name, char short_name, const char* value_name); void add_option(StringView& value, char const* help_string, char const* long_name, char short_name, char const* value_name); void add_option(int& value, const char* help_string, const char* long_name, char short_name, const char* value_name); + void add_option(unsigned& value, const char* help_string, const char* long_name, char short_name, const char* value_name); void add_option(double& value, const char* help_string, const char* long_name, char short_name, const char* value_name); void add_positional_argument(Arg&&); @@ -72,6 +73,7 @@ public: void add_positional_argument(String& value, const char* help_string, const char* name, Required required = Required::Yes); void add_positional_argument(StringView& value, char const* help_string, char const* name, Required required = Required::Yes); void add_positional_argument(int& value, const char* help_string, const char* name, Required required = Required::Yes); + void add_positional_argument(unsigned& value, const char* help_string, const char* name, Required required = Required::Yes); void add_positional_argument(double& value, const char* help_string, const char* name, Required required = Required::Yes); void add_positional_argument(Vector& value, const char* help_string, const char* name, Required required = Required::Yes); void add_positional_argument(Vector& value, const char* help_string, const char* name, Required required = Required::Yes);