diff --git a/include/cxxopts.hpp b/include/cxxopts.hpp index 95f99c3..df21542 100644 --- a/include/cxxopts.hpp +++ b/include/cxxopts.hpp @@ -27,34 +27,25 @@ THE SOFTWARE. #ifndef CXXOPTS_HPP_INCLUDED #define CXXOPTS_HPP_INCLUDED -#include +#include #include #include #include #include #include #include +#include #include #include #include #include #include #include -#include #ifdef CXXOPTS_NO_EXCEPTIONS #include #endif -#if defined(__GNUC__) && !defined(__clang__) -# if (__GNUC__ * 10 + __GNUC_MINOR__) < 49 -# define CXXOPTS_NO_REGEX true -# endif -#endif - -#ifndef CXXOPTS_NO_REGEX -# include -#endif // CXXOPTS_NO_REGEX // Nonstandard before C++17, which is coincidentally what we also need for #ifdef __has_include @@ -580,168 +571,6 @@ struct ArguDesc { std::string value = ""; }; -#ifdef CXXOPTS_NO_REGEX -inline IntegerDesc SplitInteger(const std::string &text) -{ - if (text.empty()) - { - throw_or_mimic(text); - } - IntegerDesc desc; - const char *pdata = text.c_str(); - if (*pdata == '-') - { - pdata += 1; - desc.negative = "-"; - } - if (strncmp(pdata, "0x", 2) == 0) - { - pdata += 2; - desc.base = "0x"; - } - if (*pdata != '\0') - { - desc.value = std::string(pdata); - } - else - { - throw_or_mimic(text); - } - return desc; -} - -inline bool IsTrueText(const std::string &text) -{ - const char *pdata = text.c_str(); - if (*pdata == 't' || *pdata == 'T') - { - pdata += 1; - if (strncmp(pdata, "rue\0", 4) == 0) - { - return true; - } - } - else if (strncmp(pdata, "1\0", 2) == 0) - { - return true; - } - return false; -} - -inline bool IsFalseText(const std::string &text) -{ - const char *pdata = text.c_str(); - if (*pdata == 'f' || *pdata == 'F') - { - pdata += 1; - if (strncmp(pdata, "alse\0", 5) == 0) - { - return true; - } - } - else if (strncmp(pdata, "0\0", 2) == 0) - { - return true; - } - return false; -} - -inline OptionNames split_option_names(const std::string &text) -{ - OptionNames split_names; - - std::string::size_type token_start_pos = 0; - auto length = text.length(); - - if (length == 0) - { - throw_or_mimic(text); - } - - while (token_start_pos < length) { - const auto &npos = std::string::npos; - auto next_non_space_pos = text.find_first_not_of(' ', token_start_pos); - if (next_non_space_pos == npos) { - throw_or_mimic(text); - } - token_start_pos = next_non_space_pos; - auto next_delimiter_pos = text.find(',', token_start_pos); - if (next_delimiter_pos == token_start_pos) { - throw_or_mimic(text); - } - if (next_delimiter_pos == npos) { - next_delimiter_pos = length; - } - auto token_length = next_delimiter_pos - token_start_pos; - // validate the token itself matches the regex /([:alnum:][-_[:alnum:]]*/ - { - const char* option_name_valid_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789" - "_-"; - if (!std::isalnum(text[token_start_pos], std::locale::classic()) || - text.find_first_not_of(option_name_valid_chars, token_start_pos) < next_delimiter_pos) { - throw_or_mimic(text); - } - } - split_names.emplace_back(text.substr(token_start_pos, token_length)); - token_start_pos = next_delimiter_pos + 1; - } - return split_names; -} - -inline ArguDesc ParseArgument(const char *arg, bool &matched) -{ - ArguDesc argu_desc; - const char *pdata = arg; - matched = false; - if (strncmp(pdata, "--", 2) == 0) - { - pdata += 2; - if (isalnum(*pdata, std::locale::classic())) - { - argu_desc.arg_name.push_back(*pdata); - pdata += 1; - while (isalnum(*pdata, std::locale::classic()) || *pdata == '-' || *pdata == '_') - { - argu_desc.arg_name.push_back(*pdata); - pdata += 1; - } - if (argu_desc.arg_name.length() > 1) - { - if (*pdata == '=') - { - argu_desc.set_value = true; - pdata += 1; - if (*pdata != '\0') - { - argu_desc.value = std::string(pdata); - } - matched = true; - } - else if (*pdata == '\0') - { - matched = true; - } - } - } - } - else if (strncmp(pdata, "-", 1) == 0) - { - pdata += 1; - argu_desc.grouping = true; - while (isalnum(*pdata, std::locale::classic())) - { - argu_desc.arg_name.push_back(*pdata); - pdata += 1; - } - matched = !argu_desc.arg_name.empty() && *pdata == '\0'; - } - return argu_desc; -} - -#else // CXXOPTS_NO_REGEX namespace { @@ -838,9 +667,6 @@ inline ArguDesc ParseArgument(const char *arg, bool &matched) return argu_desc; } - -#endif // CXXOPTS_NO_REGEX -#undef CXXOPTS_NO_REGEX } // namespace parser_tool namespace detail { @@ -2368,7 +2194,7 @@ OptionParser::parse(int argc, const char* const* argv) while (current != argc) { - if (strcmp(argv[current], "--") == 0) + if (std::string{argv[current]} == "--") { consume_remaining = true; ++current;