summaryrefslogtreecommitdiffstats
path: root/Source/cmStringCommand.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmStringCommand.cxx')
-rw-r--r--Source/cmStringCommand.cxx64
1 files changed, 64 insertions, 0 deletions
diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx
index dc592ba..d7b6a91 100644
--- a/Source/cmStringCommand.cxx
+++ b/Source/cmStringCommand.cxx
@@ -58,6 +58,14 @@ bool cmStringCommand::InitialPass(std::vector<std::string> const& args)
{
return this->HandleConfigureCommand(args);
}
+ else if(subCommand == "LENGTH")
+ {
+ return this->HandleLengthCommand(args);
+ }
+ else if(subCommand == "SUBSTRING")
+ {
+ return this->HandleSubstringCommand(args);
+ }
std::string e = "does not recognize sub-command "+subCommand;
this->SetError(e.c_str());
@@ -522,3 +530,59 @@ bool cmStringCommand::HandleReplaceCommand(std::vector<std::string> const& args)
m_Makefile->AddDefinition(variableName.c_str(), input.c_str());
return true;
}
+
+//----------------------------------------------------------------------------
+bool cmStringCommand::HandleSubstringCommand(std::vector<std::string> const& args)
+{
+ if(args.size() != 5)
+ {
+ this->SetError("sub-command REPLACE requires four arguments.");
+ return false;
+ }
+
+ const std::string& stringValue = args[1];
+ int begin = atoi(args[2].c_str());
+ int end = atoi(args[3].c_str());
+ const std::string& variableName = args[4];
+
+ size_t stringLength = stringValue.size();
+ int intStringLength = static_cast<int>(stringLength);
+ if ( begin < 0 || begin > intStringLength )
+ {
+ cmOStringStream ostr;
+ ostr << "begin index: " << begin << " is out of range 0 - " << stringLength;
+ this->SetError(ostr.str().c_str());
+ return false;
+ }
+ int leftOverLength = intStringLength - begin;
+ if ( end < 0 || end > intStringLength )
+ {
+ cmOStringStream ostr;
+ ostr << "end index: " << end << " is out of range " << 0 << " - " << leftOverLength;
+ this->SetError(ostr.str().c_str());
+ return false;
+ }
+
+ m_Makefile->AddDefinition(variableName.c_str(), stringValue.substr(begin, end).c_str());
+ return true;
+}
+
+//----------------------------------------------------------------------------
+bool cmStringCommand::HandleLengthCommand(std::vector<std::string> const& args)
+{
+ if(args.size() != 3)
+ {
+ this->SetError("sub-command LENGTH requires two arguments.");
+ return false;
+ }
+
+ const std::string& stringValue = args[1];
+ const std::string& variableName = args[2];
+
+ size_t length = stringValue.size();
+ char buffer[1024];
+ sprintf(buffer, "%d", length);
+
+ m_Makefile->AddDefinition(variableName.c_str(), buffer);
+ return true;
+}