diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index aa39c39a5..444e1431f 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -384,14 +384,28 @@ bool cmSystemTools::IsOn(const char* val) { return false; } - std::basic_string v = val; + size_t len = strlen(val); + if (len > 4) + { + return false; + } + std::basic_string v(val, len); + static std::set onValues; + if(onValues.empty()) + { + onValues.insert("ON"); + onValues.insert("1"); + onValues.insert("YES"); + onValues.insert("TRUE"); + onValues.insert("Y"); + } for(std::basic_string::iterator c = v.begin(); c != v.end(); c++) { *c = static_cast(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 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 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 v(val, len); for(std::basic_string::iterator c = v.begin(); c != v.end(); c++) { *c = static_cast(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); } //----------------------------------------------------------------------------