瀏覽代碼

ENH: Add upper and lower case support. Close Bug #79 - STRING TOUPPER and TOLOWER

Andy Cedilnik 22 年之前
父節點
當前提交
c4275f54c7
共有 2 個文件被更改,包括 44 次插入2 次删除
  1. 39 1
      Source/cmStringCommand.cxx
  2. 5 1
      Source/cmStringCommand.h

+ 39 - 1
Source/cmStringCommand.cxx

@@ -18,6 +18,7 @@
 #include <cmsys/RegularExpression.hxx>
 
 #include <stdlib.h> // required for atoi
+#include <ctype.h>
 //----------------------------------------------------------------------------
 bool cmStringCommand::InitialPass(std::vector<std::string> const& args)
 {
@@ -31,7 +32,15 @@ bool cmStringCommand::InitialPass(std::vector<std::string> const& args)
   if(subCommand == "REGEX")
     {
     return this->HandleRegexCommand(args);
-    }  
+    }
+  else if(subCommand == "TOLOWER")
+    {
+    return this->HandleToUpperLowerCommand(args, false);
+    }
+  else if(subCommand == "TOUPPER")
+    {
+    return this->HandleToUpperLowerCommand(args, true);
+    }
   else if(subCommand == "COMPARE")
     {
     return this->HandleCompareCommand(args);
@@ -46,6 +55,35 @@ bool cmStringCommand::InitialPass(std::vector<std::string> const& args)
   return false;
 }
 
+//----------------------------------------------------------------------------
+bool cmStringCommand::HandleToUpperLowerCommand(
+  std::vector<std::string> const& args, bool toUpper)
+{
+  if ( args.size() <= 1 )
+    {
+    this->SetError("no output variable specified");
+    return false;
+    }
+
+  std::string outvar = args[2];
+  std::string output;
+
+  bool first = true;
+
+  if (toUpper) 
+    {
+    output = cmSystemTools::UpperCase(args[1]);
+    } 
+  else 
+    {
+    output = cmSystemTools::LowerCase(args[1]);
+    }
+
+  // Store the output in the provided variable.
+  m_Makefile->AddDefinition(outvar.c_str(), output.c_str());
+  return true;
+}
+
 //----------------------------------------------------------------------------
 bool cmStringCommand::HandleAsciiCommand(std::vector<std::string> const& args)
 {

+ 5 - 1
Source/cmStringCommand.h

@@ -78,6 +78,8 @@ public:
       "  STRING(COMPARE LESS <string1> <string2> <output variable>)\n"
       "  STRING(COMPARE GREATER <string1> <string2> <output variable>)\n"
       "  STRING(ASCII <number> [<number> ...] <output variable>)\n"
+      "  STRING(TOUPPER <string1> <output variable>)\n"
+      "  STRING(TOLOWER <string1> <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 "
@@ -87,7 +89,8 @@ public:
       "in the output.\n"
       "COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and "
       "store true or false in the output variable.\n"
-      "ASCII will convert all numbers into corresponding ASCII characters.";
+      "ASCII will convert all numbers into corresponding ASCII characters.\n"
+      "TOUPPER/TOLOWER will convert string to upper/lower characters.";
     }
   
   cmTypeMacro(cmStringCommand, cmCommand);
@@ -97,6 +100,7 @@ protected:
   bool RegexMatch(std::vector<std::string> const& args);
   bool RegexMatchAll(std::vector<std::string> const& args);
   bool RegexReplace(std::vector<std::string> const& args);
+  bool HandleToUpperLowerCommand(std::vector<std::string> const& args, bool toUpper);
   bool HandleCompareCommand(std::vector<std::string> const& args);
   
   class RegexReplacement