فهرست منبع

cmFileCommand: Refactor HandleCMakePathCommand

Make use of cmJoin and fresh cmRange::transform
to reduce function complexity.
Move conversion logic to named functions.
Artur Ryt 6 سال پیش
والد
کامیت
9636b03cca
1فایلهای تغییر یافته به همراه23 افزوده شده و 24 حذف شده
  1. 23 24
      Source/cmFileCommand.cxx

+ 23 - 24
Source/cmFileCommand.cxx

@@ -2500,44 +2500,43 @@ bool cmFileCommand::HandleRemove(std::vector<std::string> const& args,
   return true;
 }
 
+namespace {
+std::string ToNativePath(const std::string& path)
+{
+  const auto& outPath = cmSystemTools::ConvertToOutputPath(path);
+  if (outPath.size() > 1 && outPath.front() == '\"' &&
+      outPath.back() == '\"') {
+    return outPath.substr(1, outPath.size() - 2);
+  }
+  return outPath;
+}
+
+std::string ToCMakePath(const std::string& path)
+{
+  auto temp = path;
+  cmSystemTools::ConvertToUnixSlashes(temp);
+  return temp;
+}
+}
+
 bool cmFileCommand::HandleCMakePathCommand(
   std::vector<std::string> const& args, bool nativePath)
 {
-  std::vector<std::string>::const_iterator i = args.begin();
   if (args.size() != 3) {
     this->SetError("FILE([TO_CMAKE_PATH|TO_NATIVE_PATH] path result) must be "
                    "called with exactly three arguments.");
     return false;
   }
-  i++; // Get rid of subcommand
 #if defined(_WIN32) && !defined(__CYGWIN__)
   char pathSep = ';';
 #else
   char pathSep = ':';
 #endif
-  std::vector<std::string> path = cmSystemTools::SplitString(*i, pathSep);
-  i++;
-  const char* var = i->c_str();
-  std::string value;
-  for (std::vector<std::string>::iterator j = path.begin(); j != path.end();
-       ++j) {
-    if (j != path.begin()) {
-      value += ";";
-    }
-    if (!nativePath) {
-      cmSystemTools::ConvertToUnixSlashes(*j);
-    } else {
-      *j = cmSystemTools::ConvertToOutputPath(*j);
-      // remove double quotes in the path
-      std::string& s = *j;
+  std::vector<std::string> path = cmSystemTools::SplitString(args[1], pathSep);
 
-      if (s.size() > 1 && s.front() == '\"' && s.back() == '\"') {
-        s = s.substr(1, s.size() - 2);
-      }
-    }
-    value += *j;
-  }
-  this->Makefile->AddDefinition(var, value.c_str());
+  std::string value = cmJoin(
+    cmMakeRange(path).transform(nativePath ? ToNativePath : ToCMakePath), ";");
+  this->Makefile->AddDefinition(args[2], value.c_str());
   return true;
 }