diff options
author | Brad King <brad.king@kitware.com> | 2011-03-02 18:47:11 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2011-03-02 18:47:11 (GMT) |
commit | c03b610c0aa20b298b15af401e1312c2b73beceb (patch) | |
tree | c3f785473d0ef406bed51493bb034b2893ff2c1e /Source/cmStringCommand.cxx | |
parent | c623008376a0758b1cb1b8f404d6a148ce938b8e (diff) | |
parent | d30dcf18b9dedcf6744a87793653bc0d94d8a8bb (diff) | |
download | CMake-c03b610c0aa20b298b15af401e1312c2b73beceb.zip CMake-c03b610c0aa20b298b15af401e1312c2b73beceb.tar.gz CMake-c03b610c0aa20b298b15af401e1312c2b73beceb.tar.bz2 |
Merge branch 'aix-xl-platform-info' into ReworkedAsmSupport
Diffstat (limited to 'Source/cmStringCommand.cxx')
-rw-r--r-- | Source/cmStringCommand.cxx | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index 949fcf5..19d2369 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) + { + cmOStringStream 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) { |