diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index fa71c90ea..4bc9ca630 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -68,6 +68,10 @@ bool cmStringCommand::InitialPass(std::vector const& args) { return this->HandleSubstringCommand(args); } + else if(subCommand == "STRIP") + { + return this->HandleStripCommand(args); + } else if(subCommand == "RANDOM") { return this->HandleRandomCommand(args); @@ -613,6 +617,43 @@ bool cmStringCommand return true; } +//---------------------------------------------------------------------------- +bool cmStringCommand::HandleStripCommand( + std::vector 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 inStringLength = stringValue.size(); + size_t startPos = inStringLength + 1; + size_t endPos = 0; + const char* ptr = stringValue.c_str(); + size_t cc; + for ( cc = 0; cc < inStringLength; ++ cc ) + { + if ( !isspace(*ptr) ) + { + if ( startPos > inStringLength ) + { + startPos = cc; + } + endPos = cc; + } + ++ ptr; + } + + size_t outLength = endPos - startPos + 1; + + this->Makefile->AddDefinition(variableName.c_str(), + stringValue.substr(startPos, outLength).c_str()); + return true; +} + //---------------------------------------------------------------------------- bool cmStringCommand ::HandleRandomCommand(std::vector const& args) diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index 23e78c75d..d46d70ce1 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -85,6 +85,7 @@ public: " STRING(TOLOWER )\n" " STRING(LENGTH )\n" " STRING(SUBSTRING )\n" + " STRING(STRIP )\n" " STRING(RANDOM [LENGTH ] [ALPHABET ]\n" " )\n" "REGEX MATCH will match the regular expression once and store the " @@ -111,6 +112,8 @@ public: "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.\n" + "STRIP will return a substring of a given string with leading " + "and trailing spaces removed.\n" "RANDOM will return a random string of given length consisting of " "characters from the given alphabet. Default length is 5 " "characters and default alphabet is all numbers and upper and " @@ -131,6 +134,7 @@ protected: bool HandleReplaceCommand(std::vector const& args); bool HandleLengthCommand(std::vector const& args); bool HandleSubstringCommand(std::vector const& args); + bool HandleStripCommand(std::vector const& args); bool HandleRandomCommand(std::vector const& args); class RegexReplacement diff --git a/Tests/StringFileTest/CMakeLists.txt b/Tests/StringFileTest/CMakeLists.txt index 618f92a45..c2bb53f83 100644 --- a/Tests/StringFileTest/CMakeLists.txt +++ b/Tests/StringFileTest/CMakeLists.txt @@ -34,6 +34,20 @@ STRING(TOUPPER "CMake" tuvar) STRING(TOLOWER "CMake" tlvar) STRING(REPLACE "Autoconf" "CMake" repvar "People should use Autoconf") +STRING(STRIP " + ST1 + " ST1) +STRING(STRIP "ST2 " ST2) +STRING(STRIP " ST3" ST3) + +FOREACH(var ST1 ST2 ST3) + IF("${var}" STREQUAL "${${var}}") + MESSAGE("[${var}] == [${${var}}]") + ELSE("${var}" STREQUAL "${${var}}") + MESSAGE(SEND_ERROR "Problem with the STRIP command for ${var}: [${${var}}]") + ENDIF("${var}" STREQUAL "${${var}}") +ENDFOREACH(var) + STRING(SUBSTRING "People should use Autoconf" 7 10 substringres) SET(substringres "Everybody ${substringres} CMake")