Commit 4ff0bb05 authored by Sebastian Holtermann's avatar Sebastian Holtermann

cmSystemTools: Make IsInternallyOn, IsON and IsOff cm::string_view based

parent 65d3ea2c
......@@ -282,115 +282,85 @@ void cmSystemTools::ReportLastSystemError(const char* msg)
cmSystemTools::Error(m);
}
bool cmSystemTools::IsInternallyOn(const char* val)
{
if (!val) {
return false;
}
std::string v = val;
if (v.size() > 4) {
return false;
}
for (char& c : v) {
c = static_cast<char>(toupper(c));
bool cmSystemTools::IsInternallyOn(cm::string_view val)
{
return (val.size() == 4) && //
(val[0] == 'I' || val[0] == 'i') && //
(val[1] == '_') && //
(val[2] == 'O' || val[2] == 'o') && //
(val[3] == 'N' || val[3] == 'n');
}
bool cmSystemTools::IsOn(cm::string_view val)
{
switch (val.size()) {
case 1:
return val[0] == '1' || val[0] == 'Y' || val[0] == 'y';
case 2:
return //
(val[0] == 'O' || val[0] == 'o') && //
(val[1] == 'N' || val[1] == 'n');
case 3:
return //
(val[0] == 'Y' || val[0] == 'y') && //
(val[1] == 'E' || val[1] == 'e') && //
(val[2] == 'S' || val[2] == 's');
case 4:
return //
(val[0] == 'T' || val[0] == 't') && //
(val[1] == 'R' || val[1] == 'r') && //
(val[2] == 'U' || val[2] == 'u') && //
(val[3] == 'E' || val[3] == 'e');
default:
break;
}
return v == "I_ON";
}
bool cmSystemTools::IsOn(const char* val)
{
if (!val) {
return false;
}
/* clang-format off */
// "1"
if (val[0] == '1' && val[1] == '\0') {
return true;
}
// "ON"
if ((val[0] == 'O' || val[0] == 'o') &&
(val[1] == 'N' || val[1] == 'n') && val[2] == '\0') {
return true;
}
// "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;
}
// "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)
bool cmSystemTools::IsNOTFOUND(cm::string_view val)
{
return cmSystemTools::IsOn(val.c_str());
return (val == "NOTFOUND") || cmHasLiteralSuffix(val, "-NOTFOUND");
}
bool cmSystemTools::IsNOTFOUND(const char* val)
bool cmSystemTools::IsOff(cm::string_view val)
{
if (strcmp(val, "NOTFOUND") == 0) {
return true;
switch (val.size()) {
case 0:
return true;
case 1:
return val[0] == '0' || val[0] == 'N' || val[0] == 'n';
case 2:
return //
(val[0] == 'N' || val[0] == 'n') && //
(val[1] == 'O' || val[1] == 'o');
case 3:
return //
(val[0] == 'O' || val[0] == 'o') && //
(val[1] == 'F' || val[1] == 'f') && //
(val[2] == 'F' || val[2] == 'f');
case 5:
return //
(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');
case 6:
return //
(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');
default:
break;
}
return cmHasLiteralSuffix(val, "-NOTFOUND");
}
bool cmSystemTools::IsOff(const char* val)
{
// ""
if (!val || val[0] == '\0') {
return true;
}
/* clang-format off */
// "0"
if (val[0] == '0' && val[1] == '\0') {
return true;
}
// "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;
}
// "N", "NO"
if ((val[0] == 'N' || val[0] == 'n') && (val[1] == '\0' || (
(val[1] == 'O' || val[1] == 'o') && val[2] == '\0'))) {
return true;
}
// "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,
std::vector<std::string>& args)
{
......
......@@ -8,6 +8,7 @@
#include "cmCryptoHash.h"
#include "cmDuration.h"
#include "cmProcessOutput.h"
#include "cm_string_view.hxx"
#include "cmsys/Process.h"
#include "cmsys/SystemTools.hxx" // IWYU pragma: export
#include <functional>
......@@ -149,26 +150,45 @@ public:
* forced this value. This is not the same as On, but this
* may be considered as "internally switched on".
*/
static bool IsInternallyOn(const char* val);
static bool IsInternallyOn(cm::string_view val);
static inline bool IsInternallyOn(const char* val)
{
if (!val) {
return false;
}
return IsInternallyOn(cm::string_view(val));
}
/**
* does a string indicate a true or on value ? This is not the same
* as ifdef.
* Does a string indicate a true or on value? This is not the same as ifdef.
*/
static bool IsOn(const char* val);
static bool IsOn(const std::string& val);
static bool IsOn(cm::string_view val);
inline static bool IsOn(const char* val)
{
if (!val) {
return false;
}
return IsOn(cm::string_view(val));
}
/**
* does a string indicate a false or off value ? Note that this is
* Does a string indicate a false or off value ? Note that this is
* not the same as !IsOn(...) because there are a number of
* ambiguous values such as "/usr/local/bin" a path will result in
* IsON and IsOff both returning false. Note that the special path
* NOTFOUND, *-NOTFOUND or IGNORE will cause IsOff to return true.
*/
static bool IsOff(const char* val);
static bool IsOff(const std::string& val);
static bool IsOff(cm::string_view val);
inline static bool IsOff(const char* val)
{
if (!val) {
return true;
}
return IsOff(cm::string_view(val));
}
//! Return true if value is NOTFOUND or ends in -NOTFOUND.
static bool IsNOTFOUND(const char* value);
static bool IsNOTFOUND(cm::string_view val);
//! Return true if the path is a framework
static bool IsPathToFramework(const std::string& value);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment