diff options
author | Brad King <brad.king@kitware.com> | 2018-09-04 13:57:15 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2018-09-04 13:57:22 (GMT) |
commit | 0a1426f00833cd1ceca669ac9a87df55fb85c080 (patch) | |
tree | e6292273a2fd7e135a3fbb80114363833e9c1237 /Source | |
parent | 6b5f4ff9292fbe38e2a00b2c1052ee8b65f24b1d (diff) | |
parent | 1bfe6991ff887dcc7cc9666a6971d21a097d6167 (diff) | |
download | CMake-0a1426f00833cd1ceca669ac9a87df55fb85c080.zip CMake-0a1426f00833cd1ceca669ac9a87df55fb85c080.tar.gz CMake-0a1426f00833cd1ceca669ac9a87df55fb85c080.tar.bz2 |
Merge topic 'improve-isonoff'
1bfe6991ff cmSystemTools: Re-implement IsOn,IsOff with manual branching
1fa0f2bd03 cmSystemTools: Add IsOn(),IsOff() overloads accepting std::string
Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: vvs31415 <vstakhovsky@fastmail.com>
Merge-request: !2336
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmSystemTools.cxx | 101 | ||||
-rw-r--r-- | Source/cmSystemTools.h | 2 |
2 files changed, 68 insertions, 35 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 72fd2bb..79e5ccf 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -42,7 +42,6 @@ #include <ctype.h> #include <errno.h> #include <iostream> -#include <set> #include <sstream> #include <stdio.h> #include <stdlib.h> @@ -372,24 +371,36 @@ bool cmSystemTools::IsOn(const char* val) if (!val) { return false; } - size_t len = strlen(val); - if (len > 4) { - return false; + /* clang-format off */ + // "1" + if (val[0] == '1' && val[1] == '\0') { + return true; } - std::string v(val, len); - - static std::set<std::string> onValues; - if (onValues.empty()) { - onValues.insert("ON"); - onValues.insert("1"); - onValues.insert("YES"); - onValues.insert("TRUE"); - onValues.insert("Y"); + // "ON" + if ((val[0] == 'O' || val[0] == 'o') && + (val[1] == 'N' || val[1] == 'n') && val[2] == '\0') { + return true; } - for (char& c : v) { - c = static_cast<char>(toupper(c)); + // "Y", "YES" + if ((val[0] == 'Y' || val[0] == 'y') && (val[1] == '\0' || ( + (val[1] == 'E' || val[1] == 'e') && + (val[2] == 'S' || val[2] == 's') && val[3] == '\0'))) { + return true; } - return (onValues.count(v) > 0); + // "TRUE" + if ((val[0] == 'T' || val[0] == 't') && + (val[1] == 'R' || val[1] == 'r') && + (val[2] == 'U' || val[2] == 'u') && + (val[3] == 'E' || val[3] == 'e') && val[4] == '\0') { + return true; + } + /* clang-format on */ + return false; +} + +bool cmSystemTools::IsOn(const std::string& val) +{ + return cmSystemTools::IsOn(val.c_str()); } bool cmSystemTools::IsNOTFOUND(const char* val) @@ -402,30 +413,50 @@ bool cmSystemTools::IsNOTFOUND(const char* val) bool cmSystemTools::IsOff(const char* val) { - if (!val || !*val) { + // "" + if (!val || val[0] == '\0') { return true; } - size_t len = strlen(val); - // Try and avoid toupper() for large strings. - if (len > 6) { - return cmSystemTools::IsNOTFOUND(val); + /* clang-format off */ + // "0" + if (val[0] == '0' && val[1] == '\0') { + return true; } - - static std::set<std::string> offValues; - if (offValues.empty()) { - offValues.insert("OFF"); - offValues.insert("0"); - offValues.insert("NO"); - offValues.insert("FALSE"); - offValues.insert("N"); - offValues.insert("IGNORE"); + // "OFF" + if ((val[0] == 'O' || val[0] == 'o') && + (val[1] == 'F' || val[1] == 'f') && + (val[2] == 'F' || val[2] == 'f') && val[3] == '\0') { + return true; } - // Try and avoid toupper(). - std::string v(val, len); - for (char& c : v) { - c = static_cast<char>(toupper(c)); + // "N", "NO" + if ((val[0] == 'N' || val[0] == 'n') && (val[1] == '\0' || ( + (val[1] == 'O' || val[1] == 'o') && val[2] == '\0'))) { + return true; } - return (offValues.count(v) > 0); + // "FALSE" + if ((val[0] == 'F' || val[0] == 'f') && + (val[1] == 'A' || val[1] == 'a') && + (val[2] == 'L' || val[2] == 'l') && + (val[3] == 'S' || val[3] == 's') && + (val[4] == 'E' || val[4] == 'e') && val[5] == '\0') { + return true; + } + // "IGNORE" + if ((val[0] == 'I' || val[0] == 'i') && + (val[1] == 'G' || val[1] == 'g') && + (val[2] == 'N' || val[2] == 'n') && + (val[3] == 'O' || val[3] == 'o') && + (val[4] == 'R' || val[4] == 'r') && + (val[5] == 'E' || val[5] == 'e') && val[6] == '\0') { + return true; + } + /* clang-format on */ + return cmSystemTools::IsNOTFOUND(val); +} + +bool cmSystemTools::IsOff(const std::string& val) +{ + return cmSystemTools::IsOff(val.c_str()); } void cmSystemTools::ParseWindowsCommandLine(const char* command, diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index c0a1b6b..5c383ee 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -129,6 +129,7 @@ public: * as ifdef. */ static bool IsOn(const char* val); + static bool IsOn(const std::string& val); /** * does a string indicate a false or off value ? Note that this is @@ -138,6 +139,7 @@ public: * NOTFOUND, *-NOTFOUND or IGNORE will cause IsOff to return true. */ static bool IsOff(const char* val); + static bool IsOff(const std::string& val); ///! Return true if value is NOTFOUND or ends in -NOTFOUND. static bool IsNOTFOUND(const char* value); |