diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmStringCommand.cxx | 64 | ||||
-rw-r--r-- | Source/cmStringCommand.h | 8 |
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 { |