cmStringAlgorithms: Add functions to parse strings to long long integers

This commit is contained in:
Brad King
2022-09-20 11:12:23 -04:00
parent 5d80d7cb6a
commit 31f158e4c8
3 changed files with 77 additions and 0 deletions

View File

@@ -250,6 +250,38 @@ bool cmStrToULong(std::string const& str, unsigned long* value)
return cmStrToULong(str.c_str(), value);
}
bool cmStrToLongLong(const char* str, long long* value)
{
errno = 0;
char* endp;
*value = strtoll(str, &endp, 10);
return (*endp == '\0') && (endp != str) && (errno == 0);
}
bool cmStrToLongLong(std::string const& str, long long* value)
{
return cmStrToLongLong(str.c_str(), value);
}
bool cmStrToULongLong(const char* str, unsigned long long* value)
{
errno = 0;
char* endp;
while (cmIsSpace(*str)) {
++str;
}
if (*str == '-') {
return false;
}
*value = strtoull(str, &endp, 10);
return (*endp == '\0') && (endp != str) && (errno == 0);
}
bool cmStrToULongLong(std::string const& str, unsigned long long* value)
{
return cmStrToULongLong(str.c_str(), value);
}
template <typename Range>
std::size_t getJoinedLength(Range const& rng, cm::string_view separator)
{

View File

@@ -303,3 +303,13 @@ bool cmStrToLong(std::string const& str, long* value);
* integer */
bool cmStrToULong(const char* str, unsigned long* value);
bool cmStrToULong(std::string const& str, unsigned long* value);
/** Converts a string to long long. Expects that the whole string
* is an integer */
bool cmStrToLongLong(const char* str, long long* value);
bool cmStrToLongLong(std::string const& str, long long* value);
/** Converts a string to unsigned long long. Expects that the whole string
* is an integer */
bool cmStrToULongLong(const char* str, unsigned long long* value);
bool cmStrToULongLong(std::string const& str, unsigned long long* value);

View File

@@ -226,6 +226,41 @@ int testStringAlgorithms(int /*unused*/, char* /*unused*/ [])
"cmStrToULong rejects trailing content.");
}
// ----------------------------------------------------------------------
// Test cmStrToLongLong
{
long long value;
assert_ok(cmStrToLongLong("1", &value) && value == 1,
"cmStrToLongLong parses a positive decimal integer.");
assert_ok(cmStrToLongLong(" 1", &value) && value == 1,
"cmStrToLongLong parses a decimal integer after whitespace.");
assert_ok(cmStrToLongLong("-1", &value) && value == -1,
"cmStrToLongLong parses a negative decimal integer.");
assert_ok(
cmStrToLongLong(" -1", &value) && value == -1,
"cmStrToLongLong parses a negative decimal integer after whitespace.");
assert_ok(!cmStrToLongLong("1x", &value),
"cmStrToLongLong rejects trailing content.");
}
// ----------------------------------------------------------------------
// Test cmStrToULongLong
{
unsigned long long value;
assert_ok(cmStrToULongLong("1", &value) && value == 1,
"cmStrToULongLong parses a decimal integer.");
assert_ok(cmStrToULongLong(" 1", &value) && value == 1,
"cmStrToULongLong parses a decimal integer after whitespace.");
assert_ok(!cmStrToULongLong("-1", &value),
"cmStrToULongLong rejects a negative number.");
assert_ok(!cmStrToULongLong(" -1", &value),
"cmStrToULongLong rejects a negative number after whitespace.");
assert_ok(!cmStrToULongLong("1x", &value),
"cmStrToULongLong rejects trailing content.");
}
// ----------------------------------------------------------------------
// Test cmStrLen
{