Merge "Implement help command for dicttoolkit."
diff --git a/native/dicttoolkit/src/command_executors/diff_executor.cpp b/native/dicttoolkit/src/command_executors/diff_executor.cpp
index 1fe90a9..077a400 100644
--- a/native/dicttoolkit/src/command_executors/diff_executor.cpp
+++ b/native/dicttoolkit/src/command_executors/diff_executor.cpp
@@ -28,5 +28,11 @@
     return 0;
 }
 
+/* static */ void DiffExecutor::printUsage() {
+    printf("*** %s\n", COMMAND_NAME);
+    printf("Usage: %s\n", COMMAND_NAME);
+    printf("Shows differences between two dictionaries.\n\n");
+}
+
 } // namespace dicttoolkit
 } // namespace latinime
diff --git a/native/dicttoolkit/src/command_executors/diff_executor.h b/native/dicttoolkit/src/command_executors/diff_executor.h
index 5b4e9e6..fc8dc0d 100644
--- a/native/dicttoolkit/src/command_executors/diff_executor.h
+++ b/native/dicttoolkit/src/command_executors/diff_executor.h
@@ -27,6 +27,7 @@
     static const char *const COMMAND_NAME;
 
     static int run(const int argc, char **argv);
+    static void printUsage();
 
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(DiffExecutor);
diff --git a/native/dicttoolkit/src/command_executors/header_executor.cpp b/native/dicttoolkit/src/command_executors/header_executor.cpp
index ec2ca81..068a62c 100644
--- a/native/dicttoolkit/src/command_executors/header_executor.cpp
+++ b/native/dicttoolkit/src/command_executors/header_executor.cpp
@@ -28,5 +28,11 @@
     return 0;
 }
 
+/* static */ void HeaderExecutor::printUsage() {
+    printf("*** %s\n", COMMAND_NAME);
+    printf("Usage: %s\n", COMMAND_NAME);
+    printf("Prints the header contents of a dictionary file.\n\n");
+}
+
 } // namespace dicttoolkit
 } // namespace latinime
diff --git a/native/dicttoolkit/src/command_executors/header_executor.h b/native/dicttoolkit/src/command_executors/header_executor.h
index b482e6b..4cdeb1a 100644
--- a/native/dicttoolkit/src/command_executors/header_executor.h
+++ b/native/dicttoolkit/src/command_executors/header_executor.h
@@ -27,6 +27,7 @@
     static const char *const COMMAND_NAME;
 
     static int run(const int argc, char **argv);
+    static void printUsage();
 
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(HeaderExecutor);
diff --git a/native/dicttoolkit/src/command_executors/help_executor.cpp b/native/dicttoolkit/src/command_executors/help_executor.cpp
index dba9f79..bd29a5b 100644
--- a/native/dicttoolkit/src/command_executors/help_executor.cpp
+++ b/native/dicttoolkit/src/command_executors/help_executor.cpp
@@ -17,6 +17,14 @@
 #include "command_executors/help_executor.h"
 
 #include <cstdio>
+#include <functional>
+#include <vector>
+
+#include "command_executors/diff_executor.h"
+#include "command_executors/header_executor.h"
+#include "command_executors/info_executor.h"
+#include "command_executors/makedict_executor.h"
+#include "utils/command_utils.h"
 
 namespace latinime {
 namespace dicttoolkit {
@@ -24,9 +32,21 @@
 const char *const HelpExecutor::COMMAND_NAME = "help";
 
 /* static */ int HelpExecutor::run(const int argc, char **argv) {
-    fprintf(stderr, "Command '%s' has not been implemented yet.\n", COMMAND_NAME);
+    printf("Available commands:\n\n");
+    const std::vector<std::function<void(void)>> printUsageMethods = {DiffExecutor::printUsage,
+            HeaderExecutor::printUsage, InfoExecutor::printUsage, MakedictExecutor::printUsage,
+            printUsage};
+    for (const auto &printUsageMethod : printUsageMethods) {
+        printUsageMethod();
+    }
     return 0;
 }
 
+/* static */ void HelpExecutor::printUsage() {
+    printf("*** %s\n", COMMAND_NAME);
+    printf("Usage: %s\n", COMMAND_NAME);
+    printf("Show this help list.\n\n");
+}
+
 } // namespace dicttoolkit
 } // namespace latinime
diff --git a/native/dicttoolkit/src/command_executors/help_executor.h b/native/dicttoolkit/src/command_executors/help_executor.h
index 245fda9..280610e 100644
--- a/native/dicttoolkit/src/command_executors/help_executor.h
+++ b/native/dicttoolkit/src/command_executors/help_executor.h
@@ -27,6 +27,7 @@
     static const char *const COMMAND_NAME;
 
     static int run(const int argc, char **argv);
+    static void printUsage();
 
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(HelpExecutor);
diff --git a/native/dicttoolkit/src/command_executors/info_executor.cpp b/native/dicttoolkit/src/command_executors/info_executor.cpp
index 5c9a636..c4d84ca 100644
--- a/native/dicttoolkit/src/command_executors/info_executor.cpp
+++ b/native/dicttoolkit/src/command_executors/info_executor.cpp
@@ -28,5 +28,11 @@
     return 0;
 }
 
+/* static */ void InfoExecutor::printUsage() {
+    printf("*** %s\n", COMMAND_NAME);
+    printf("Usage: %s\n", COMMAND_NAME);
+    printf("Prints various information about a dictionary file.\n\n");
+}
+
 } // namespace dicttoolkit
 } // namespace latinime
diff --git a/native/dicttoolkit/src/command_executors/info_executor.h b/native/dicttoolkit/src/command_executors/info_executor.h
index b42bc0e..4ffa74f 100644
--- a/native/dicttoolkit/src/command_executors/info_executor.h
+++ b/native/dicttoolkit/src/command_executors/info_executor.h
@@ -27,6 +27,7 @@
     static const char *const COMMAND_NAME;
 
     static int run(const int argc, char **argv);
+    static void printUsage();
 
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(InfoExecutor);
diff --git a/native/dicttoolkit/src/command_executors/makedict_executor.cpp b/native/dicttoolkit/src/command_executors/makedict_executor.cpp
index 5466a59..ea62e3c 100644
--- a/native/dicttoolkit/src/command_executors/makedict_executor.cpp
+++ b/native/dicttoolkit/src/command_executors/makedict_executor.cpp
@@ -28,5 +28,13 @@
     return 0;
 }
 
+/* static */ void MakedictExecutor::printUsage() {
+    printf("*** %s\n", COMMAND_NAME);
+    printf("Usage: %s\n", COMMAND_NAME);
+    printf("Converts a source dictionary file to one or several outputs.\n"
+            "Source can be a binary dictionary file or a combined format file.\n"
+            "Binary version 2 (Jelly Bean), 4, and combined format outputs are supported.\n\n");
+}
+
 } // namespace dicttoolkit
 } // namespace latinime
diff --git a/native/dicttoolkit/src/command_executors/makedict_executor.h b/native/dicttoolkit/src/command_executors/makedict_executor.h
index 466d1f7..ae1309f 100644
--- a/native/dicttoolkit/src/command_executors/makedict_executor.h
+++ b/native/dicttoolkit/src/command_executors/makedict_executor.h
@@ -27,6 +27,7 @@
     static const char *const COMMAND_NAME;
 
     static int run(const int argc, char **argv);
+    static void printUsage();
 
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(MakedictExecutor);