add . as valid char in option names

This commit is contained in:
Ryan Leary 2022-07-29 10:21:01 -04:00
parent a10bd5233b
commit 3a908a8fb5
No known key found for this signature in database
GPG Key ID: B910660499F72730
2 changed files with 8 additions and 5 deletions

View File

@ -680,7 +680,7 @@ inline OptionNames split_option_names(const std::string &text)
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyz"
"0123456789" "0123456789"
"_-"; "_-.?";
if (!std::isalnum(text[token_start_pos]) || if (!std::isalnum(text[token_start_pos]) ||
text.find_first_not_of(option_name_valid_chars, token_start_pos) < next_delimiter_pos) { text.find_first_not_of(option_name_valid_chars, token_start_pos) < next_delimiter_pos) {
throw_or_mimic<exceptions::invalid_option_format>(text); throw_or_mimic<exceptions::invalid_option_format>(text);
@ -754,9 +754,9 @@ std::basic_regex<char> falsy_pattern
("(f|F)(alse)?|0"); ("(f|F)(alse)?|0");
std::basic_regex<char> option_matcher std::basic_regex<char> option_matcher
("--([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([[:alnum:]].*)"); ("--([[:alnum:]][-_[:alnum:]\\.]+)(=(.*))?|-([[:alnum:]].*)");
std::basic_regex<char> option_specifier std::basic_regex<char> option_specifier
("([[:alnum:]][-_[:alnum:]]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*"); ("([[:alnum:]][-_[:alnum:]\\.]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*");
std::basic_regex<char> option_specifier_separator(", *"); std::basic_regex<char> option_specifier_separator(", *");
} // namespace } // namespace

View File

@ -56,6 +56,7 @@ TEST_CASE("Basic options", "[options]")
("a,av", "a short option with a value", cxxopts::value<std::string>()) ("a,av", "a short option with a value", cxxopts::value<std::string>())
("6,six", "a short number option") ("6,six", "a short number option")
("p, space", "an option with space between short and long") ("p, space", "an option with space between short and long")
("period.delimited", "an option with a period in the long name")
("nothing", "won't exist", cxxopts::value<std::string>()) ("nothing", "won't exist", cxxopts::value<std::string>())
; ;
@ -77,7 +78,8 @@ TEST_CASE("Basic options", "[options]")
"-z", "-z",
"--over", "--over",
"--dog", "--dog",
"--lazy" "--lazy",
"--period.delimited",
}); });
auto** actual_argv = argv.argv(); auto** actual_argv = argv.argv();
@ -97,9 +99,10 @@ TEST_CASE("Basic options", "[options]")
CHECK(result.count("quick") == 2); CHECK(result.count("quick") == 2);
CHECK(result.count("f") == 2); CHECK(result.count("f") == 2);
CHECK(result.count("z") == 4); CHECK(result.count("z") == 4);
CHECK(result.count("period.delimited") == 1);
auto& arguments = result.arguments(); auto& arguments = result.arguments();
REQUIRE(arguments.size() == 15); REQUIRE(arguments.size() == 16);
CHECK(arguments[0].key() == "long"); CHECK(arguments[0].key() == "long");
CHECK(arguments[0].value() == "true"); CHECK(arguments[0].value() == "true");
CHECK(arguments[0].as<bool>() == true); CHECK(arguments[0].as<bool>() == true);