summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2002-07-01 12:49:36 (GMT)
committerKen Martin <ken.martin@kitware.com>2002-07-01 12:49:36 (GMT)
commita43a65bf34285b55393fc1d8ec9df008e010bdd2 (patch)
tree8a48b0a91beb78179ae5ff1fe9ef3353b8ab3df2
parente0c3d1e959961bc4f531bee5bff23bc7607ef7af (diff)
downloadCMake-a43a65bf34285b55393fc1d8ec9df008e010bdd2.zip
CMake-a43a65bf34285b55393fc1d8ec9df008e010bdd2.tar.gz
CMake-a43a65bf34285b55393fc1d8ec9df008e010bdd2.tar.bz2
consolidated IF handling and added checks for bad arguments
-rw-r--r--Source/cmElseCommand.cxx145
-rw-r--r--Source/cmIfCommand.cxx114
-rw-r--r--Source/cmIfCommand.h5
3 files changed, 83 insertions, 181 deletions
diff --git a/Source/cmElseCommand.cxx b/Source/cmElseCommand.cxx
index ad11fe7..dd39690 100644
--- a/Source/cmElseCommand.cxx
+++ b/Source/cmElseCommand.cxx
@@ -19,148 +19,19 @@
bool cmElseCommand::InitialPass(std::vector<std::string> const& args)
{
- if(args.size() < 1 )
- {
- this->SetError("called with incorrect number of arguments");
- return false;
- }
-
- // create a function blocker
- cmIfFunctionBlocker *f = NULL;
-
- // check for the different signatures
- const char *def;
- const char *def2;
-
- if (args.size() == 1)
- {
- def = m_Makefile->GetDefinition(args[0].c_str());
- if(!cmSystemTools::IsOff(def))
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 2 && (args[0] == "COMMAND"))
- {
- if(m_Makefile->CommandExists(args[1].c_str()))
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 2 && (args[0] == "EXISTS"))
- {
- if(cmSystemTools::FileExists(args[1].c_str()))
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 2 && (args[0] == "NOT"))
- {
- def = m_Makefile->GetDefinition(args[1].c_str());
- if(cmSystemTools::IsOff(def))
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 3 && (args[1] == "AND"))
- {
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
- if(!cmSystemTools::IsOff(def) && !cmSystemTools::IsOff(def2))
- {
- f = new cmIfFunctionBlocker();
- }
- }
+ bool isValid;
+ bool isTrue = cmIfCommand::IsTrue(args,isValid,m_Makefile);
- if (args.size() == 3 && (args[1] == "OR"))
+ if (!isValid)
{
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
- if(!cmSystemTools::IsOff(def) || !cmSystemTools::IsOff(def2))
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 3 && (args[1] == "LESS"))
- {
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
- if (!def)
- {
- def = args[0].c_str();
- }
- if (!def2)
- {
- def2 = args[2].c_str();
- }
- if(atof(def) < atof(def2))
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 3 && (args[1] == "GREATER"))
- {
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
- if (!def)
- {
- def = args[0].c_str();
- }
- if (!def2)
- {
- def2 = args[2].c_str();
- }
- if(atof(def) > atof(def2))
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 3 && (args[1] == "STRLESS"))
- {
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
- if(strcmp(def,def2) < 0)
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 3 && (args[1] == "STRGREATER"))
- {
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
- if(strcmp(def,def2) > 0)
- {
- f = new cmIfFunctionBlocker();
- }
- }
-
- if (args.size() == 3 && (args[1] == "MATCHES"))
- {
- def = m_Makefile->GetDefinition(args[0].c_str());
- if (!def)
- {
- def = args[0].c_str();
- }
- cmRegularExpression regEntry(args[2].c_str());
-
- // check for black line or comment
- if (regEntry.find(def))
- {
- f = new cmIfFunctionBlocker();
- }
+ this->SetError("An ELSE command had incorrect arguments");
+ return false;
}
- // if we created a function blocker then set its args
- if (f)
+ // if is true create a blocker for the else
+ if (isTrue)
{
+ cmIfFunctionBlocker *f = new cmIfFunctionBlocker();
for(std::vector<std::string>::const_iterator j = args.begin();
j != args.end(); ++j)
{
diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx
index 2a36853..5d207d4 100644
--- a/Source/cmIfCommand.cxx
+++ b/Source/cmIfCommand.cxx
@@ -71,75 +71,108 @@ ScopeEnded(cmMakefile &mf)
bool cmIfCommand::InitialPass(std::vector<std::string> const& args)
{
- if(args.size() < 1 )
+ bool isValid;
+ bool isTrue = cmIfCommand::IsTrue(args,isValid,m_Makefile);
+
+ if (!isValid)
{
- this->SetError("called with incorrect number of arguments");
+ this->SetError("An IF command had incorrect arguments");
return false;
}
- // create a function blocker
- cmIfFunctionBlocker *f = NULL;
+
+ // if is isn't true create a blocker
+ if (!isTrue)
+ {
+ cmIfFunctionBlocker *f = new cmIfFunctionBlocker();
+ for(std::vector<std::string>::const_iterator j = args.begin();
+ j != args.end(); ++j)
+ {
+ f->m_Args.push_back(*j);
+ }
+ m_Makefile->AddFunctionBlocker(f);
+ }
+
+ return true;
+}
+bool cmIfCommand::IsTrue(const std::vector<std::string> &args, bool &isValid,
+ const cmMakefile *makefile)
+{
// check for the different signatures
+ bool isTrue = true;
+ isValid = false;
const char *def;
const char *def2;
+ if(args.size() < 1 )
+ {
+ return false;
+ }
+
if (args.size() == 1)
{
- def = m_Makefile->GetDefinition(args[0].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
if(cmSystemTools::IsOff(def))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 2 && (args[0] == "NOT"))
{
- def = m_Makefile->GetDefinition(args[1].c_str());
+ def = makefile->GetDefinition(args[1].c_str());
if(!cmSystemTools::IsOff(def))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
+
}
if (args.size() == 2 && (args[0] == "COMMAND"))
{
- if(!m_Makefile->CommandExists(args[1].c_str()))
+ if(!makefile->CommandExists(args[1].c_str()))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 2 && (args[0] == "EXISTS"))
{
if(!cmSystemTools::FileExists(args[1].c_str()))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 3 && (args[1] == "AND"))
{
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
+ def2 = makefile->GetDefinition(args[2].c_str());
if(cmSystemTools::IsOff(def) || cmSystemTools::IsOff(def2))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 3 && (args[1] == "OR"))
{
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
+ def2 = makefile->GetDefinition(args[2].c_str());
if(cmSystemTools::IsOff(def) && cmSystemTools::IsOff(def2))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 3 && (args[1] == "MATCHES"))
{
- def = m_Makefile->GetDefinition(args[0].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
if (!def)
{
def = args[0].c_str();
@@ -149,14 +182,15 @@ bool cmIfCommand::InitialPass(std::vector<std::string> const& args)
// check for black line or comment
if (!regEntry.find(def))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 3 && (args[1] == "LESS"))
{
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
+ def2 = makefile->GetDefinition(args[2].c_str());
if (!def)
{
def = args[0].c_str();
@@ -167,14 +201,15 @@ bool cmIfCommand::InitialPass(std::vector<std::string> const& args)
}
if(atof(def) >= atof(def2))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 3 && (args[1] == "GREATER"))
{
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
+ def2 = makefile->GetDefinition(args[2].c_str());
if (!def)
{
def = args[0].c_str();
@@ -185,41 +220,32 @@ bool cmIfCommand::InitialPass(std::vector<std::string> const& args)
}
if(atof(def) <= atof(def2))
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 3 && (args[1] == "STRLESS"))
{
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
+ def2 = makefile->GetDefinition(args[2].c_str());
if(strcmp(def,def2) >= 0)
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
if (args.size() == 3 && (args[1] == "STRGREATER"))
{
- def = m_Makefile->GetDefinition(args[0].c_str());
- def2 = m_Makefile->GetDefinition(args[2].c_str());
+ def = makefile->GetDefinition(args[0].c_str());
+ def2 = makefile->GetDefinition(args[2].c_str());
if(strcmp(def,def2) <= 0)
{
- f = new cmIfFunctionBlocker();
+ isTrue = false;
}
+ isValid = true;
}
- // if we created a function blocker then set its args
- if (f)
- {
- for(std::vector<std::string>::const_iterator j = args.begin();
- j != args.end(); ++j)
- {
- f->m_Args.push_back(*j);
- }
- m_Makefile->AddFunctionBlocker(f);
- }
-
- return true;
+ return isTrue;
}
-
diff --git a/Source/cmIfCommand.h b/Source/cmIfCommand.h
index 2453c3c..b9a4fbb 100644
--- a/Source/cmIfCommand.h
+++ b/Source/cmIfCommand.h
@@ -98,6 +98,11 @@ public:
"and STRGREATER. LESS and GREATER do numeric comparison while "
"STRLESS and STRGREATER do string comparisons.";
}
+
+ // this is a shared function for both If and Else to determine if
+ // the arguments were valid, and if so, was the response true
+ static bool IsTrue(const std::vector<std::string> &args,
+ bool &isValid, const cmMakefile *mf);
cmTypeMacro(cmIfCommand, cmCommand);
};