From ae7aa73dd529b84ad75c7a3c75461be1d7c18454 Mon Sep 17 00:00:00 2001
From: Philippe Teuwen <phil@teuwen.org>
Date: Wed, 26 Mar 2014 22:08:55 +0100
Subject: [PATCH] Add option -h to dump complete set of supported commands

Usage: ./proxmark3 -h
Display both offline & online commands, online commands are flagged.

git-svn-id: https://proxmark3.googlecode.com/svn/trunk@850 ef4ab9da-24cd-11de-8aaa-f3a34680c41f
---
 client/cmdparser.c |  4 +++-
 client/proxmark3.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/client/cmdparser.c b/client/cmdparser.c
index 7ea1bf47..48d044d5 100644
--- a/client/cmdparser.c
+++ b/client/cmdparser.c
@@ -21,8 +21,10 @@ void CmdsHelp(const command_t Commands[])
   int i = 0;
   while (Commands[i].Name)
   {
-    if (!offline || Commands[i].Offline)
+    if (offline == 0 || Commands[i].Offline)
       PrintAndLog("%-16s %s", Commands[i].Name, Commands[i].Help);
+    if (offline == 2 && !Commands[i].Offline)
+      PrintAndLog("%-14s @ %s", Commands[i].Name, Commands[i].Help);
     ++i;
   }
 }
diff --git a/client/proxmark3.c b/client/proxmark3.c
index 91bc7b31..e40b4def 100644
--- a/client/proxmark3.c
+++ b/client/proxmark3.c
@@ -206,15 +206,59 @@ static void *main_loop(void *targ) {
   return NULL;
 }
 
+#define DUMPHELP(cmd) \
+  do { \
+    printf("%s\n", cmd); \
+    printf("---------------------------------------------\n"); \
+    CommandReceived(cmd); \
+    printf("\n"); \
+  } while (0)
+
+static void dumphelp()
+{
+  offline=2;
+  printf("\n------------PROXMARK3 HELP DUMP--------------\n");
+  printf("Some commands are available only if a Proxmark is actually connected,\n");
+  printf("Those commands are flagged with \"@\" in front of their description.\n");
+  printf("\n");
+  DUMPHELP("help");
+  DUMPHELP("data help");
+  DUMPHELP("hf help");
+  DUMPHELP("hf 14a help");
+  DUMPHELP("hf 14b help");
+  DUMPHELP("hf 15 help");
+  DUMPHELP("hf epa help");
+  DUMPHELP("hf legic help");
+  DUMPHELP("hf iclass help");
+  DUMPHELP("hf mf help");
+  DUMPHELP("hw help");
+  DUMPHELP("lf help");
+  DUMPHELP("lf em4x help");
+  DUMPHELP("lf hid help");
+  DUMPHELP("lf ti help");
+  DUMPHELP("lf hitag help");
+  DUMPHELP("lf pcf7931 help");
+  DUMPHELP("lf t55xx help");
+}
+
 int main(int argc, char* argv[]) {
 	srand(time(0));
   
 	if (argc < 2) {
 		printf("syntax: %s <port>\n\n",argv[0]);
 		printf("\tLinux example:'%s /dev/ttyACM0'\n\n", argv[0]);
+		printf("help:   %s -h\n\n", argv[0]);
+		printf("\tDump all interactive help at once\n");
 		return 1;
 	}
   
+	if (strcmp(argv[1], "-h") == 0) {
+		printf("syntax: %s <port>\n\n",argv[0]);
+		printf("\tLinux example:'%s /dev/ttyACM0'\n\n", argv[0]);
+		offline = 2;
+		dumphelp();
+		return 0;
+	}
 	// Make sure to initialize
 	struct main_loop_arg marg = {
 		.usb_present = 0,
-- 
2.39.5