summaryrefslogtreecommitdiffstats
path: root/Source/cmStringCommand.cxx
diff options
context:
space:
mode:
authorTim Hütz <tim@huetz.biz>2011-02-15 10:20:47 (GMT)
committerBrad King <brad.king@kitware.com>2011-02-15 18:17:51 (GMT)
commit1462561a8cab7cf3cad9979019778f3c13b0bdf9 (patch)
tree16a8b3dde44d41a108737f688461184200c8a15e /Source/cmStringCommand.cxx
parent4d1240eb0a8d0f867d7e15fe63fc6389ea550e60 (diff)
downloadCMake-1462561a8cab7cf3cad9979019778f3c13b0bdf9.zip
CMake-1462561a8cab7cf3cad9979019778f3c13b0bdf9.tar.gz
CMake-1462561a8cab7cf3cad9979019778f3c13b0bdf9.tar.bz2
Add a string(FIND) sub-command (#11795)
Diffstat (limited to 'Source/cmStringCommand.cxx')
-rw-r--r--Source/cmStringCommand.cxx68
1 files changed, 67 insertions, 1 deletions
diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx
index 949fcf5..1f873e2 100644
--- a/Source/cmStringCommand.cxx
+++ b/Source/cmStringCommand.cxx
@@ -72,7 +72,11 @@ bool cmStringCommand
{
return this->HandleRandomCommand(args);
}
-
+ else if(subCommand == "FIND")
+ {
+ return this->HandleFindCommand(args);
+ }
+
std::string e = "does not recognize sub-command "+subCommand;
this->SetError(e.c_str());
return false;
@@ -499,6 +503,68 @@ void cmStringCommand::StoreMatches(cmMakefile* mf,cmsys::RegularExpression& re)
}
//----------------------------------------------------------------------------
+bool cmStringCommand::HandleFindCommand(std::vector<std::string> const&
+ args)
+{
+ // check if all required parameters were passed
+ if(args.size() < 4 || args.size() > 5)
+ {
+ this->SetError("sub-command FIND requires 3 or 4 parameters.");
+ return false;
+ }
+
+ // check if the reverse flag was set or not
+ bool reverseMode = false;
+ if(args.size() == 5 && args[4] == "REVERSE")
+ {
+ reverseMode = true;
+ }
+
+ // if we have 5 arguments the last one must be REVERSE
+ if(args.size() == 5 && args[4] != "REVERSE")
+ {
+ this->SetError("sub-command FIND: unknown last parameter");
+ return false;
+ }
+
+ // local parameter names.
+ const std::string& sstring = args[1];
+ const std::string& schar = args[2];
+ const std::string& outvar = args[3];
+
+ // ensure that the user cannot accidentally specify REVERSE as a variable
+ if(outvar == "REVERSE")
+ {
+ this->SetError("sub-command FIND does not allow to select REVERSE as "
+ "the output variable. "
+ "Maybe you missed the actual output variable?");
+ return false;
+ }
+
+ // try to find the character and return its position
+ size_t pos;
+ if(!reverseMode)
+ {
+ pos = sstring.find(schar);
+ }
+ else
+ {
+ pos = sstring.rfind(schar);
+ }
+ if(std::string::npos != pos)
+ {
+ std::stringstream s;
+ s << pos;
+ this->Makefile->AddDefinition(outvar.c_str(), s.str().c_str());
+ return true;
+ }
+
+ // the character was not found, but this is not really an error
+ this->Makefile->AddDefinition(outvar.c_str(), "-1");
+ return true;
+}
+
+//----------------------------------------------------------------------------
bool cmStringCommand::HandleCompareCommand(std::vector<std::string> const&
args)
{