summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/cmStringCommand.cxx64
-rw-r--r--Source/cmStringCommand.h8
2 files changed, 71 insertions, 1 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;
+}
diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h
index cbdf811..8c6a11c 100644
--- a/Source/cmStringCommand.h
+++ b/Source/cmStringCommand.h
@@ -83,6 +83,8 @@ public:
" [@ONLY] [ESCAPE_QUOTES])\n"
" STRING(TOUPPER <string1> <output variable>)\n"
" STRING(TOLOWER <string1> <output variable>)\n"
+ " STRING(LENGTH <string> <output variable>)\n"
+ " STRING(SUBSTRING <string> <begin> <end> <output variable>)\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 "
@@ -104,7 +106,9 @@ public:
"ASCII will convert all numbers into corresponding ASCII characters.\n"
"CONFIGURE will transform a string like CONFIGURE_FILE transforms "
"a file.\n"
- "TOUPPER/TOLOWER will convert string to upper/lower characters.";
+ "TOUPPER/TOLOWER will convert string to upper/lower characters.\n"
+ "LENGTH will return a given string's length.\n"
+ "SUBSTRING will return a substring of a given string.";
}
cmTypeMacro(cmStringCommand, cmCommand);
@@ -118,6 +122,8 @@ protected:
bool HandleToUpperLowerCommand(std::vector<std::string> const& args, bool toUpper);
bool HandleCompareCommand(std::vector<std::string> const& args);
bool HandleReplaceCommand(std::vector<std::string> const& args);
+ bool HandleLengthCommand(std::vector<std::string> const& args);
+ bool HandleSubstringCommand(std::vector<std::string> const& args);
class RegexReplacement
{