Parse a uint32_t flag value.
| 81 | |
| 82 | // Parse a uint32_t flag value. |
| 83 | bool parse_flag_value(Flag<uint32_t>& flag, const std::string& value) { |
| 84 | std::regex unsigned_pattern("^ *[0-9]+ *$"); |
| 85 | if (!std::regex_match(value, unsigned_pattern)) { |
| 86 | std::cerr << "'" << value << "' is not a unsigned number." << std::endl; |
| 87 | return false; |
| 88 | } |
| 89 | |
| 90 | errno = 0; |
| 91 | char* end_ptr = nullptr; |
| 92 | const uint64_t number = strtoull(value.c_str(), &end_ptr, 10); |
| 93 | if (end_ptr == nullptr || end_ptr != value.c_str() + value.size() || |
| 94 | errno == EINVAL) { |
| 95 | std::cerr << "'" << value << "' is not a unsigned number." << std::endl; |
| 96 | return false; |
| 97 | } |
| 98 | |
| 99 | if (errno == ERANGE || number > static_cast<size_t>(UINT32_MAX)) { |
| 100 | std::cerr << "'" << value << "' cannot be represented as a 32bit unsigned." |
| 101 | << std::endl; |
| 102 | return false; |
| 103 | } |
| 104 | |
| 105 | flag.value() = static_cast<uint32_t>(number); |
| 106 | return true; |
| 107 | } |
| 108 | |
| 109 | // "Parse" a string flag value (assigns it, cannot fail). |
| 110 | bool parse_flag_value(Flag<std::string>& flag, const std::string& value) { |
no test coverage detected