summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2022-09-20 11:12:23 -0400
committerBrad King <brad.king@kitware.com>2022-09-20 12:00:08 -0400
commit31f158e4c881bea2b526102b2024b0fb34ade42d (patch)
tree5013888d1c3c2dd765c641946e82fc8468c6485c
parent5d80d7cb6a76e92ac5b0fa5352cdda64415124b7 (diff)
downloadcmake-31f158e4c881bea2b526102b2024b0fb34ade42d.tar.gz
cmStringAlgorithms: Add functions to parse strings to long long integers
-rw-r--r--Source/cmStringAlgorithms.cxx32
-rw-r--r--Source/cmStringAlgorithms.h10
-rw-r--r--Tests/CMakeLib/testStringAlgorithms.cxx35
3 files changed, 77 insertions, 0 deletions
diff --git a/Source/cmStringAlgorithms.cxx b/Source/cmStringAlgorithms.cxx
index 1bb6808199..f73c854131 100644
--- a/Source/cmStringAlgorithms.cxx
+++ b/Source/cmStringAlgorithms.cxx
@@ -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)
{
diff --git a/Source/cmStringAlgorithms.h b/Source/cmStringAlgorithms.h
index 492e588bbd..83938bc246 100644
--- a/Source/cmStringAlgorithms.h
+++ b/Source/cmStringAlgorithms.h
@@ -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);
diff --git a/Tests/CMakeLib/testStringAlgorithms.cxx b/Tests/CMakeLib/testStringAlgorithms.cxx
index c2706c1f92..1e6b6118ee 100644
--- a/Tests/CMakeLib/testStringAlgorithms.cxx
+++ b/Tests/CMakeLib/testStringAlgorithms.cxx
@@ -227,6 +227,41 @@ int testStringAlgorithms(int /*unused*/, char* /*unused*/ [])
}
// ----------------------------------------------------------------------
+ // 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
{
constexpr auto len = cmStrLen("Hello world!");