Explorar el Código

Merge topic 'cmRemoveQuotes'

27090096ef cmStringAlgorithms: Add cmRemoveQuotes

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3665
Kyle Edwards hace 6 años
padre
commit
9ab15fa74a

+ 0 - 8
Source/cmGlobalGenerator.cxx

@@ -2270,14 +2270,6 @@ bool cmGlobalGenerator::NameResolvesToFramework(
   return false;
 }
 
-inline std::string removeQuotes(const std::string& s)
-{
-  if (s.front() == '\"' && s.back() == '\"') {
-    return s.substr(1, s.size() - 2);
-  }
-  return s;
-}
-
 bool cmGlobalGenerator::CheckCMP0037(std::string const& targetName,
                                      std::string const& reason) const
 {

+ 14 - 0
Source/cmStringAlgorithms.cxx

@@ -21,6 +21,20 @@ std::string cmTrimWhitespace(cm::string_view str)
   return std::string(start, stop + 1);
 }
 
+std::string cmRemoveQuotes(cm::string_view str)
+{
+  // We process only strings that have two quotes at least.
+  // Also front() and back() are only defined behavior on non empty strings.
+  if (str.size() >= 2 &&    //
+      str.front() == '"' && //
+      str.back() == '"') {
+    // Remove a quote from the front and back
+    str.remove_prefix(1);
+    str.remove_suffix(1);
+  }
+  return std::string(str);
+}
+
 std::string cmEscapeQuotes(cm::string_view str)
 {
   std::string result;

+ 3 - 0
Source/cmStringAlgorithms.h

@@ -41,6 +41,9 @@ inline bool cmIsSpace(char ch)
 /** Returns a string that has whitespace removed from the start and the end. */
 std::string cmTrimWhitespace(cm::string_view str);
 
+/** Returns a string that has quotes removed from the start and the end. */
+std::string cmRemoveQuotes(cm::string_view str);
+
 /** Escape quotes in a string.  */
 std::string cmEscapeQuotes(cm::string_view str);
 

+ 0 - 8
Source/cmake.cxx

@@ -2270,14 +2270,6 @@ void cmake::TruncateOutputLog(const char* fname)
   }
 }
 
-inline std::string removeQuotes(const std::string& s)
-{
-  if (s.front() == '\"' && s.back() == '\"') {
-    return s.substr(1, s.size() - 2);
-  }
-  return s;
-}
-
 void cmake::MarkCliAsUsed(const std::string& variable)
 {
   this->UsedCliVariables[variable] = true;

+ 23 - 0
Tests/CMakeLib/testStringAlgorithms.cxx

@@ -50,6 +50,29 @@ int testStringAlgorithms(int /*unused*/, char* /*unused*/ [])
                   "cmTrimWhitespace front and back");
   }
 
+  // ----------------------------------------------------------------------
+  // Test cmRemoveQuotes
+  {
+    auto test = [&assert_string](cm::string_view source,
+                                 cm::string_view expected,
+                                 cm::string_view title) {
+      assert_string(cmRemoveQuotes(source), expected, title);
+    };
+
+    test("", "", "cmRemoveQuotes empty");
+    test("\"", "\"", "cmRemoveQuotes single quote");
+    test("\"\"", "", "cmRemoveQuotes double quote");
+    test("\"a", "\"a", "cmRemoveQuotes quote char");
+    test("\"ab", "\"ab", "cmRemoveQuotes quote char char");
+    test("a\"", "a\"", "cmRemoveQuotes char quote");
+    test("ab\"", "ab\"", "cmRemoveQuotes char char quote");
+    test("a", "a", "cmRemoveQuotes single char");
+    test("ab", "ab", "cmRemoveQuotes two chars");
+    test("abc", "abc", "cmRemoveQuotes three chars");
+    test("\"abc\"", "abc", "cmRemoveQuotes quoted chars");
+    test("\"\"abc\"\"", "\"abc\"", "cmRemoveQuotes quoted quoted chars");
+  }
+
   // ----------------------------------------------------------------------
   // Test cmEscapeQuotes
   {