diff --git a/Libraries/LibCore/ArgsParser.cpp b/Libraries/LibCore/ArgsParser.cpp index a256376b94..8ddbfdd883 100644 --- a/Libraries/LibCore/ArgsParser.cpp +++ b/Libraries/LibCore/ArgsParser.cpp @@ -324,6 +324,28 @@ void ArgsParser::add_positional_argument(int& value, const char* help_string, co add_positional_argument(move(arg)); } +static constexpr bool isnan(double __x) { return __builtin_isnan(__x); } + +void ArgsParser::add_positional_argument(double& 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) { + char *p; + double v = strtod(s, &p); + bool valid_value = !isnan(v) && p != s; + if (valid_value) { + value = v; + } + return valid_value; + } + }; + add_positional_argument(move(arg)); +} + void ArgsParser::add_positional_argument(Vector& values, const char* help_string, const char* name, Required required) { Arg arg { diff --git a/Libraries/LibCore/ArgsParser.h b/Libraries/LibCore/ArgsParser.h index 43b94e4dc1..007310c7fe 100644 --- a/Libraries/LibCore/ArgsParser.h +++ b/Libraries/LibCore/ArgsParser.h @@ -77,6 +77,7 @@ public: void add_positional_argument(Arg&&); void add_positional_argument(const char*& value, const char* help_string, const char* 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(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); private: