From d66aa2262ab04f695aa4f9869cd7ffa4450b3ac3 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 4 Dec 2002 18:44:39 -0500 Subject: [PATCH] ENH: Added COMPARE modes to STRING command. --- Source/cmStringCommand.cxx | 60 ++++++++++++++++++++++++++++++++++++++ Source/cmStringCommand.h | 8 ++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index 8278a851bd..f6e473a6da 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -30,6 +30,10 @@ bool cmStringCommand::InitialPass(std::vector const& args) { return this->HandleRegexCommand(args); } + else if(subCommand == "COMPARE") + { + return this->HandleCompareCommand(args); + } std::string e = "does not recognize sub-command "+subCommand; this->SetError(e.c_str()); @@ -307,3 +311,59 @@ bool cmStringCommand::RegexReplace(std::vector const& args) m_Makefile->AddDefinition(outvar.c_str(), output.c_str()); return true; } + +//---------------------------------------------------------------------------- +bool cmStringCommand::HandleCompareCommand(std::vector const& args) +{ + if(args.size() < 2) + { + this->SetError("sub-command COMPARE requires a mode to be specified."); + return false; + } + std::string mode = args[1]; + if((mode == "EQUAL") || (mode == "NOTEQUAL") || + (mode == "LESS") || (mode == "GREATER")) + { + if(args.size() < 5) + { + std::string e = "sub-command COMPARE, mode "; + e += mode; + e += " needs at least 5 arguments total to command."; + this->SetError(e.c_str()); + return false; + } + + const std::string& left = args[2]; + const std::string& right = args[3]; + const std::string& outvar = args[4]; + bool result; + if(mode == "LESS") + { + result = (left < right); + } + else if(mode == "GREATER") + { + result = (left > right); + } + else if(mode == "EQUAL") + { + result = (left == right); + } + else // if(mode == "NOTEQUAL") + { + result = !(left == right); + } + if(result) + { + m_Makefile->AddDefinition(outvar.c_str(), "1"); + } + else + { + m_Makefile->AddDefinition(outvar.c_str(), "0"); + } + return true; + } + std::string e = "sub-command COMPARE does not recognize mode "+mode; + this->SetError(e.c_str()); + return false; +} diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index dfb033d2f1..c78f3ac3e8 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -63,11 +63,16 @@ public: "STRING(REGEX MATCH [...])\n" "STRING(REGEX MATCHALL [...])\n" "STRING(REGEX REPLACE [...])\n" + "STRING(COMPARE EQUAL )\n" + "STRING(COMPARE NOTEQUAL )\n" + "STRING(COMPARE LESS )\n" + "STRING(COMPARE GREATER )\n" "REGEX MATCH will match the regular expression once and store the match in the output variable.\n" "REGEX MATCHALL will match the regular expression as many times as possible and store the matches\n" " in the output variable as a list.\n" "REGEX REPLACE will match the regular expression as many times as possible and substitute the\n" - " replacement expression for the match in the output.\n"; + " replacement expression for the match in the output.\n" + "COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and store true or false in the output variable.\n"; } cmTypeMacro(cmStringCommand, cmCommand); @@ -76,6 +81,7 @@ protected: bool RegexMatch(std::vector const& args); bool RegexMatchAll(std::vector const& args); bool RegexReplace(std::vector const& args); + bool HandleCompareCommand(std::vector const& args); class RegexReplacement {