浏览代码

cmFileCommand: Use cmSubcommandTable

Regina Pfeifer 6 年之前
父节点
当前提交
a7a5f376bc
共有 1 个文件被更改,包括 119 次插入116 次删除
  1. 119 116
      Source/cmFileCommand.cxx

+ 119 - 116
Source/cmFileCommand.cxx

@@ -41,6 +41,7 @@
 #include "cmRuntimeDependencyArchive.h"
 #include "cmState.h"
 #include "cmStringAlgorithms.h"
+#include "cmSubcommandTable.h"
 #include "cmSystemTools.h"
 #include "cmTimestamp.h"
 #include "cm_sys_stat.h"
@@ -87,8 +88,8 @@ std::string fix_file_url_windows(const std::string& url)
 }
 #endif
 
-bool HandleWriteCommand(std::vector<std::string> const& args, bool append,
-                        cmExecutionStatus& status)
+bool HandleWriteImpl(std::vector<std::string> const& args, bool append,
+                     cmExecutionStatus& status)
 {
   std::vector<std::string>::const_iterator i = args.begin();
 
@@ -157,6 +158,18 @@ bool HandleWriteCommand(std::vector<std::string> const& args, bool append,
   return true;
 }
 
+bool HandleWriteCommand(std::vector<std::string> const& args,
+                        cmExecutionStatus& status)
+{
+  return HandleWriteImpl(args, false, status);
+}
+
+bool HandleAppendCommand(std::vector<std::string> const& args,
+                         cmExecutionStatus& status)
+{
+  return HandleWriteImpl(args, true, status);
+}
+
 bool HandleReadCommand(std::vector<std::string> const& args,
                        cmExecutionStatus& status)
 {
@@ -648,8 +661,8 @@ bool HandleStringsCommand(std::vector<std::string> const& args,
   return true;
 }
 
-bool HandleGlobCommand(std::vector<std::string> const& args, bool recurse,
-                       cmExecutionStatus& status)
+bool HandleGlobImpl(std::vector<std::string> const& args, bool recurse,
+                    cmExecutionStatus& status)
 {
   // File commands has at least one argument
   assert(args.size() > 1);
@@ -836,6 +849,18 @@ bool HandleGlobCommand(std::vector<std::string> const& args, bool recurse,
   return true;
 }
 
+bool HandleGlobCommand(std::vector<std::string> const& args,
+                       cmExecutionStatus& status)
+{
+  return HandleGlobImpl(args, false, status);
+}
+
+bool HandleGlobRecurseCommand(std::vector<std::string> const& args,
+                              cmExecutionStatus& status)
+{
+  return HandleGlobImpl(args, true, status);
+}
+
 bool HandleMakeDirectoryCommand(std::vector<std::string> const& args,
                                 cmExecutionStatus& status)
 {
@@ -868,8 +893,8 @@ bool HandleMakeDirectoryCommand(std::vector<std::string> const& args,
   return true;
 }
 
-bool HandleTouchCommand(std::vector<std::string> const& args, bool create,
-                        cmExecutionStatus& status)
+bool HandleTouchImpl(std::vector<std::string> const& args, bool create,
+                     cmExecutionStatus& status)
 {
   // File command has at least one argument
   assert(args.size() > 1);
@@ -898,6 +923,18 @@ bool HandleTouchCommand(std::vector<std::string> const& args, bool create,
   return true;
 }
 
+bool HandleTouchCommand(std::vector<std::string> const& args,
+                        cmExecutionStatus& status)
+{
+  return HandleTouchImpl(args, true, status);
+}
+
+bool HandleTouchNocreateCommand(std::vector<std::string> const& args,
+                                cmExecutionStatus& status)
+{
+  return HandleTouchImpl(args, false, status);
+}
+
 bool HandleDifferentCommand(std::vector<std::string> const& args,
                             cmExecutionStatus& status)
 {
@@ -1296,8 +1333,8 @@ bool HandleRename(std::vector<std::string> const& args,
   return true;
 }
 
-bool HandleRemove(std::vector<std::string> const& args, bool recurse,
-                  cmExecutionStatus& status)
+bool HandleRemoveImpl(std::vector<std::string> const& args, bool recurse,
+                      cmExecutionStatus& status)
 {
 
   std::string message;
@@ -1327,6 +1364,18 @@ bool HandleRemove(std::vector<std::string> const& args, bool recurse,
   return true;
 }
 
+bool HandleRemove(std::vector<std::string> const& args,
+                  cmExecutionStatus& status)
+{
+  return HandleRemoveImpl(args, false, status);
+}
+
+bool HandleRemoveRecurse(std::vector<std::string> const& args,
+                         cmExecutionStatus& status)
+{
+  return HandleRemoveImpl(args, true, status);
+}
+
 std::string ToNativePath(const std::string& path)
 {
   const auto& outPath = cmSystemTools::ConvertToOutputPath(path);
@@ -1344,8 +1393,9 @@ std::string ToCMakePath(const std::string& path)
   return temp;
 }
 
-bool HandleCMakePathCommand(std::vector<std::string> const& args,
-                            bool nativePath, cmExecutionStatus& status)
+bool HandlePathCommand(std::vector<std::string> const& args,
+                       std::string (*convert)(std::string const&),
+                       cmExecutionStatus& status)
 {
   if (args.size() != 3) {
     status.SetError("FILE([TO_CMAKE_PATH|TO_NATIVE_PATH] path result) must be "
@@ -1359,12 +1409,23 @@ bool HandleCMakePathCommand(std::vector<std::string> const& args,
 #endif
   std::vector<std::string> path = cmSystemTools::SplitString(args[1], pathSep);
 
-  std::string value = cmJoin(
-    cmMakeRange(path).transform(nativePath ? ToNativePath : ToCMakePath), ";");
+  std::string value = cmJoin(cmMakeRange(path).transform(convert), ";");
   status.GetMakefile().AddDefinition(args[2], value);
   return true;
 }
 
+bool HandleCMakePathCommand(std::vector<std::string> const& args,
+                            cmExecutionStatus& status)
+{
+  return HandlePathCommand(args, ToCMakePath, status);
+}
+
+bool HandleNativePathCommand(std::vector<std::string> const& args,
+                             cmExecutionStatus& status)
+{
+  return HandlePathCommand(args, ToNativePath, status);
+}
+
 #if defined(CMAKE_BUILD_WITH_CMAKE)
 
 // Stuff for curl download/upload
@@ -2777,109 +2838,51 @@ bool cmFileCommand(std::vector<std::string> const& args,
     status.SetError("must be called with at least two arguments.");
     return false;
   }
-  std::string const& subCommand = args[0];
-  if (subCommand == "WRITE") {
-    return HandleWriteCommand(args, false, status);
-  }
-  if (subCommand == "APPEND") {
-    return HandleWriteCommand(args, true, status);
-  }
-  if (subCommand == "DOWNLOAD") {
-    return HandleDownloadCommand(args, status);
-  }
-  if (subCommand == "UPLOAD") {
-    return HandleUploadCommand(args, status);
-  }
-  if (subCommand == "READ") {
-    return HandleReadCommand(args, status);
-  }
-  if (subCommand == "MD5" || subCommand == "SHA1" || subCommand == "SHA224" ||
-      subCommand == "SHA256" || subCommand == "SHA384" ||
-      subCommand == "SHA512" || subCommand == "SHA3_224" ||
-      subCommand == "SHA3_256" || subCommand == "SHA3_384" ||
-      subCommand == "SHA3_512") {
-    return HandleHashCommand(args, status);
-  }
-  if (subCommand == "STRINGS") {
-    return HandleStringsCommand(args, status);
-  }
-  if (subCommand == "GLOB") {
-    return HandleGlobCommand(args, false, status);
-  }
-  if (subCommand == "GLOB_RECURSE") {
-    return HandleGlobCommand(args, true, status);
-  }
-  if (subCommand == "MAKE_DIRECTORY") {
-    return HandleMakeDirectoryCommand(args, status);
-  }
-  if (subCommand == "RENAME") {
-    return HandleRename(args, status);
-  }
-  if (subCommand == "REMOVE") {
-    return HandleRemove(args, false, status);
-  }
-  if (subCommand == "REMOVE_RECURSE") {
-    return HandleRemove(args, true, status);
-  }
-  if (subCommand == "COPY") {
-    return HandleCopyCommand(args, status);
-  }
-  if (subCommand == "INSTALL") {
-    return HandleInstallCommand(args, status);
-  }
-  if (subCommand == "DIFFERENT") {
-    return HandleDifferentCommand(args, status);
-  }
-  if (subCommand == "RPATH_CHANGE" || subCommand == "CHRPATH") {
-    return HandleRPathChangeCommand(args, status);
-  }
-  if (subCommand == "RPATH_CHECK") {
-    return HandleRPathCheckCommand(args, status);
-  }
-  if (subCommand == "RPATH_REMOVE") {
-    return HandleRPathRemoveCommand(args, status);
-  }
-  if (subCommand == "READ_ELF") {
-    return HandleReadElfCommand(args, status);
-  }
-  if (subCommand == "RELATIVE_PATH") {
-    return HandleRelativePathCommand(args, status);
-  }
-  if (subCommand == "TO_CMAKE_PATH") {
-    return HandleCMakePathCommand(args, false, status);
-  }
-  if (subCommand == "TO_NATIVE_PATH") {
-    return HandleCMakePathCommand(args, true, status);
-  }
-  if (subCommand == "TOUCH") {
-    return HandleTouchCommand(args, true, status);
-  }
-  if (subCommand == "TOUCH_NOCREATE") {
-    return HandleTouchCommand(args, false, status);
-  }
-  if (subCommand == "TIMESTAMP") {
-    return HandleTimestampCommand(args, status);
-  }
-  if (subCommand == "GENERATE") {
-    return HandleGenerateCommand(args, status);
-  }
-  if (subCommand == "LOCK") {
-    return HandleLockCommand(args, status);
-  }
-  if (subCommand == "SIZE") {
-    return HandleSizeCommand(args, status);
-  }
-  if (subCommand == "READ_SYMLINK") {
-    return HandleReadSymlinkCommand(args, status);
-  }
-  if (subCommand == "CREATE_LINK") {
-    return HandleCreateLinkCommand(args, status);
-  }
-  if (subCommand == "GET_RUNTIME_DEPENDENCIES") {
-    return HandleGetRuntimeDependenciesCommand(args, status);
-  }
 
-  std::string e = "does not recognize sub-command " + subCommand;
-  status.SetError(e);
-  return false;
+  static cmSubcommandTable const subcommand{
+    { "WRITE"_s, HandleWriteCommand },
+    { "APPEND"_s, HandleAppendCommand },
+    { "DOWNLOAD"_s, HandleDownloadCommand },
+    { "UPLOAD"_s, HandleUploadCommand },
+    { "READ"_s, HandleReadCommand },
+    { "MD5"_s, HandleHashCommand },
+    { "SHA1"_s, HandleHashCommand },
+    { "SHA224"_s, HandleHashCommand },
+    { "SHA256"_s, HandleHashCommand },
+    { "SHA384"_s, HandleHashCommand },
+    { "SHA512"_s, HandleHashCommand },
+    { "SHA3_224"_s, HandleHashCommand },
+    { "SHA3_256"_s, HandleHashCommand },
+    { "SHA3_384"_s, HandleHashCommand },
+    { "SHA3_512"_s, HandleHashCommand },
+    { "STRINGS"_s, HandleStringsCommand },
+    { "GLOB"_s, HandleGlobCommand },
+    { "GLOB_RECURSE"_s, HandleGlobRecurseCommand },
+    { "MAKE_DIRECTORY"_s, HandleMakeDirectoryCommand },
+    { "RENAME"_s, HandleRename },
+    { "REMOVE"_s, HandleRemove },
+    { "REMOVE_RECURSE"_s, HandleRemoveRecurse },
+    { "COPY"_s, HandleCopyCommand },
+    { "INSTALL"_s, HandleInstallCommand },
+    { "DIFFERENT"_s, HandleDifferentCommand },
+    { "RPATH_CHANGE"_s, HandleRPathChangeCommand },
+    { "CHRPATH"_s, HandleRPathChangeCommand },
+    { "RPATH_CHECK"_s, HandleRPathCheckCommand },
+    { "RPATH_REMOVE"_s, HandleRPathRemoveCommand },
+    { "READ_ELF"_s, HandleReadElfCommand },
+    { "RELATIVE_PATH"_s, HandleRelativePathCommand },
+    { "TO_CMAKE_PATH"_s, HandleCMakePathCommand },
+    { "TO_NATIVE_PATH"_s, HandleNativePathCommand },
+    { "TOUCH"_s, HandleTouchCommand },
+    { "TOUCH_NOCREATE"_s, HandleTouchNocreateCommand },
+    { "TIMESTAMP"_s, HandleTimestampCommand },
+    { "GENERATE"_s, HandleGenerateCommand },
+    { "LOCK"_s, HandleLockCommand },
+    { "SIZE"_s, HandleSizeCommand },
+    { "READ_SYMLINK"_s, HandleReadSymlinkCommand },
+    { "CREATE_LINK"_s, HandleCreateLinkCommand },
+    { "GET_RUNTIME_DEPENDENCIES"_s, HandleGetRuntimeDependenciesCommand },
+  };
+
+  return subcommand(args[0], args, status);
 }