diff options
author | Ben Boeckel <mathstuf@gmail.com> | 2014-02-08 10:42:14 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2014-07-08 15:18:15 (GMT) |
commit | 43a8c5526d12c1346793ced5a4be85b9e9a3d695 (patch) | |
tree | 477ff79585c9f0cd36b4163a65c02b32dcda7764 | |
parent | 9270aa9a2d1ea05e7bd63ef5214f4fbaafd14d2e (diff) | |
download | CMake-43a8c5526d12c1346793ced5a4be85b9e9a3d695.zip CMake-43a8c5526d12c1346793ced5a4be85b9e9a3d695.tar.gz CMake-43a8c5526d12c1346793ced5a4be85b9e9a3d695.tar.bz2 |
SystemTools: Use a set in Is{On,Off}
Also check before calling toupper() umpteen million times.
-rw-r--r-- | Source/cmSystemTools.cxx | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index aa39c39..444e143 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -384,14 +384,28 @@ bool cmSystemTools::IsOn(const char* val) { return false; } - std::basic_string<char> v = val; + size_t len = strlen(val); + if (len > 4) + { + return false; + } + std::basic_string<char> 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"); + } for(std::basic_string<char>::iterator c = v.begin(); c != v.end(); c++) { *c = static_cast<char>(toupper(*c)); } - return (v == "ON" || v == "1" || v == "YES" || v == "TRUE" || v == "Y"); + return (onValues.count(v) > 0); } bool cmSystemTools::IsNOTFOUND(const char* val) @@ -410,16 +424,31 @@ bool cmSystemTools::IsOff(const char* val) { return true; } - size_t len = val ? strlen(val) : 0; - std::basic_string<char> v(val, len); + size_t len = strlen(val); + // Try and avoid toupper() for large strings. + if (len > 6) + { + return cmSystemTools::IsNOTFOUND(val); + } + 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"); + } + // Try and avoid toupper(). + std::basic_string<char> v(val, len); for(std::basic_string<char>::iterator c = v.begin(); c != v.end(); c++) { *c = static_cast<char>(toupper(*c)); } - return (v == "OFF" || v == "0" || v == "NO" || v == "FALSE" || - v == "N" || cmSystemTools::IsNOTFOUND(v.c_str()) || v == "IGNORE"); + return (offValues.count(v) > 0); } //---------------------------------------------------------------------------- |