Explorar el Código

ENH: Add STRING STRIP command

Andy Cedilnik hace 18 años
padre
commit
1d4613a63b
Se han modificado 3 ficheros con 59 adiciones y 0 borrados
  1. 41 0
      Source/cmStringCommand.cxx
  2. 4 0
      Source/cmStringCommand.h
  3. 14 0
      Tests/StringFileTest/CMakeLists.txt

+ 41 - 0
Source/cmStringCommand.cxx

@@ -68,6 +68,10 @@ bool cmStringCommand::InitialPass(std::vector<std::string> 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<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 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<std::string> const& args)

+ 4 - 0
Source/cmStringCommand.h

@@ -85,6 +85,7 @@ public:
       "  STRING(TOLOWER <string1> <output variable>)\n"
       "  STRING(LENGTH <string> <output variable>)\n"
       "  STRING(SUBSTRING <string> <begin> <length> <output variable>)\n"
+      "  STRING(STRIP <string> <output variable>)\n"
       "  STRING(RANDOM [LENGTH <length>] [ALPHABET <alphabet>]\n"
       "         <output variable>)\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<std::string> const& args);
   bool HandleLengthCommand(std::vector<std::string> const& args);
   bool HandleSubstringCommand(std::vector<std::string> const& args);
+  bool HandleStripCommand(std::vector<std::string> const& args);
   bool HandleRandomCommand(std::vector<std::string> const& args);
   
   class RegexReplacement

+ 14 - 0
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")