Fixes to implement generation of markdown auto-generated documentation

This commit is contained in:
Martin Holst Swende 2014-03-26 22:35:25 +01:00 committed by Philippe Teuwen
parent ae7aa73dd5
commit 57c695563f
8 changed files with 104 additions and 49 deletions

View file

@ -851,7 +851,7 @@ static command_t CommandTable[] =
{ {
{"help", CmdHelp, 1, "This help"}, {"help", CmdHelp, 1, "This help"},
{"amp", CmdAmp, 1, "Amplify peaks"}, {"amp", CmdAmp, 1, "Amplify peaks"},
{"askdemod", Cmdaskdemod, 1, "<0|1> -- Attempt to demodulate simple ASK tags"}, {"askdemod", Cmdaskdemod, 1, "<0 or 1> -- Attempt to demodulate simple ASK tags"},
{"autocorr", CmdAutoCorr, 1, "<window length> -- Autocorrelation over window"}, {"autocorr", CmdAutoCorr, 1, "<window length> -- Autocorrelation over window"},
{"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"}, {"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"},
{"bitstream", CmdBitstream, 1, "[clock rate] -- Convert waveform into a bitstream"}, {"bitstream", CmdBitstream, 1, "[clock rate] -- Convert waveform into a bitstream"},

View file

@ -11,6 +11,8 @@
#ifndef CMDDATA_H__ #ifndef CMDDATA_H__
#define CMDDATA_H__ #define CMDDATA_H__
command_t * CmdDataCommands();
int CmdData(const char *Cmd); int CmdData(const char *Cmd);
int CmdAmp(const char *Cmd); int CmdAmp(const char *Cmd);

View file

@ -536,7 +536,7 @@ static command_t CommandTable[] =
{"io", CmdLFIO, 1, "{ ioProx tags... }"}, {"io", CmdLFIO, 1, "{ ioProx tags... }"},
{"indalademod", CmdIndalaDemod, 1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"}, {"indalademod", CmdIndalaDemod, 1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"},
{"indalaclone", CmdIndalaClone, 1, "<UID> ['l']-- Clone Indala to T55x7 (tag must be in antenna)(UID in HEX)(option 'l' for 224 UID"}, {"indalaclone", CmdIndalaClone, 1, "<UID> ['l']-- Clone Indala to T55x7 (tag must be in antenna)(UID in HEX)(option 'l' for 224 UID"},
{"read", CmdLFRead, 0, "['h'|<divisor>] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134, alternatively: f=12MHz/(divisor+1))"}, {"read", CmdLFRead, 0, "['h' or <divisor>] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134, alternatively: f=12MHz/(divisor+1))"},
{"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"}, {"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},
{"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, {"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
{"simman", CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"}, {"simman", CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},

View file

@ -45,17 +45,21 @@ static int cmd_tail;//Starts as 0
static command_t CommandTable[] = static command_t CommandTable[] =
{ {
{"help", CmdHelp, 1, "This help. Use '<command> help' for details of the following commands:\n"}, {"help", CmdHelp, 1, "This help. Use '<command> help' for details of a particular command."},
{"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"}, {"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"},
{"exit", CmdQuit, 1, "Exit program"},
{"hf", CmdHF, 1, "{ HF commands... }"}, {"hf", CmdHF, 1, "{ HF commands... }"},
{"hw", CmdHW, 1, "{ Hardware commands... }"}, {"hw", CmdHW, 1, "{ Hardware commands... }"},
{"lf", CmdLF, 1, "{ LF commands... }"}, {"lf", CmdLF, 1, "{ LF commands... }"},
{"quit", CmdQuit, 1, "Quit program"}, {"script", CmdScript, 1,"{ Scripting commands }"},
{"script", CmdScript, 1,"Run script"}, {"quit", CmdQuit, 1, "Exit program"},
{"exit", CmdQuit, 1, "Exit program"},
{NULL, NULL, 0, NULL} {NULL, NULL, 0, NULL}
}; };
command_t* getTopLevelCommandTable()
{
return CommandTable;
}
int CmdHelp(const char *Cmd) int CmdHelp(const char *Cmd)
{ {
CmdsHelp(CommandTable); CmdsHelp(CommandTable);

View file

@ -12,10 +12,11 @@
#define CMDMAIN_H__ #define CMDMAIN_H__
#include "usb_cmd.h" #include "usb_cmd.h"
#include "cmdparser.h"
void UsbCommandReceived(UsbCommand *UC); void UsbCommandReceived(UsbCommand *UC);
void CommandReceived(char *Cmd); void CommandReceived(char *Cmd);
bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout); bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout);
bool WaitForResponse(uint32_t cmd, UsbCommand* response); bool WaitForResponse(uint32_t cmd, UsbCommand* response);
void clearCommandBuffer(); void clearCommandBuffer();
command_t* getTopLevelCommandTable();
#endif #endif

View file

@ -9,6 +9,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "ui.h" #include "ui.h"
#include "cmdparser.h" #include "cmdparser.h"
@ -21,16 +22,26 @@ void CmdsHelp(const command_t Commands[])
int i = 0; int i = 0;
while (Commands[i].Name) while (Commands[i].Name)
{ {
if (offline == 0 || Commands[i].Offline) if(Commands[i].Offline)
PrintAndLog("%-16s %s", Commands[i].Name, Commands[i].Help); {
if (offline == 2 && !Commands[i].Offline) PrintAndLog("%-16s \t%s", Commands[i].Name, Commands[i].Help);
PrintAndLog("%-14s @ %s", Commands[i].Name, Commands[i].Help); }else
{
PrintAndLog("%-16s @\t%s", Commands[i].Name, Commands[i].Help);
}
++i; ++i;
} }
} }
void CmdsParse(const command_t Commands[], const char *Cmd) void CmdsParse(const command_t Commands[], const char *Cmd)
{ {
if(strcmp( Cmd, "XX_internal_command_dump_XX") == 0)
{// Markdown dump children
dumpCommandsRecursive(Commands);
return;
}
char cmd_name[32]; char cmd_name[32];
int len = 0; int len = 0;
memset(cmd_name, 0, 32); memset(cmd_name, 0, 32);
@ -62,3 +73,53 @@ void CmdsParse(const command_t Commands[], const char *Cmd)
CmdsHelp(Commands); CmdsHelp(Commands);
} }
} }
//static int tablevel = 0;
char pparent[512] = {0};
char *parent = pparent;
void dumpCommandsRecursive(const command_t cmds[])
{
if (cmds[0].Name == NULL)
return;
int i = 0;
char* tabulation = "###";
char* offline = "N";
// First, dump all single commands, which are not a container for
// other commands
printf("command|offline|description\n");
printf("-------|-------|-----------\n");
while (cmds[i].Name)
{
if(cmds[i].Help[0] == '{' && ++i) continue;
if ( cmds[i].Offline) offline = "Y";
printf("|`%s%s`|%s|`%s`|\n", parent, cmds[i].Name,offline, cmds[i].Help);
++i;
}
printf("\n\n");
i=0;
// Then, print the categories. These will go into subsections with their own tables
while (cmds[i].Name)
{
if(cmds[i].Help[0] != '{' && ++i) continue;
printf("%s %s%s\n\n %s\n\n", tabulation, parent, cmds[i].Name, cmds[i].Help);
char currentparent[512] = {0};
snprintf(currentparent, sizeof currentparent, "%s%s ", parent, cmds[i].Name);
char *old_parent = parent;
parent = currentparent;
// tablevel++;
// This is what causes the recursion, since commands Parse-implementation
// in turn calls the CmdsParse above.
cmds[i].Parse("XX_internal_command_dump_XX");
// tablevel--;
parent = old_parent;
++i;
}
}

View file

@ -25,5 +25,6 @@ typedef struct command_s
void CmdsHelp(const command_t Commands[]); void CmdsHelp(const command_t Commands[]);
// Parse a command line // Parse a command line
void CmdsParse(const command_t Commands[], const char *Cmd); void CmdsParse(const command_t Commands[], const char *Cmd);
void dumpCommandsRecursive(const command_t cmds[]);
#endif #endif

View file

@ -23,6 +23,8 @@
#include "uart.h" #include "uart.h"
#include "ui.h" #include "ui.h"
#include "sleep.h" #include "sleep.h"
#include "cmdparser.h"
#include "cmdmain.h"
// a global mutex to prevent interlaced printing from different threads // a global mutex to prevent interlaced printing from different threads
pthread_mutex_t print_lock; pthread_mutex_t print_lock;
@ -31,7 +33,6 @@ static serial_port sp;
static UsbCommand txcmd; static UsbCommand txcmd;
volatile static bool txcmd_pending = false; volatile static bool txcmd_pending = false;
void SendCommand(UsbCommand *c) { void SendCommand(UsbCommand *c) {
#if 0 #if 0
printf("Sending %d bytes\n", sizeof(UsbCommand)); printf("Sending %d bytes\n", sizeof(UsbCommand));
@ -206,39 +207,25 @@ static void *main_loop(void *targ) {
return NULL; return NULL;
} }
#define DUMPHELP(cmd) \ //static void dumpHelp(char *parent, ...)
do { \ //{
printf("%s\n", cmd); \ // printf("## %s\n\n", parent);
printf("---------------------------------------------\n"); \ // CommandReceived(parent);
CommandReceived(cmd); \ //
printf("\n"); \ // printf("\n");
} while (0) //}
static void dumphelp() static void dumpAllHelp()
{ {
offline=2; offline=3;
printf("\n------------PROXMARK3 HELP DUMP--------------\n"); printf("\n# Proxmark3 command dump\n\n");
printf("Some commands are available only if a Proxmark is actually connected,\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("Those commands are flagged with \"@\" in front of their description.\n");
printf("\n"); printf("\n");
DUMPHELP("help"); command_t *cmds = getTopLevelCommandTable();
DUMPHELP("data help");
DUMPHELP("hf help"); dumpCommandsRecursive(cmds);
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[]) { int main(int argc, char* argv[]) {
@ -255,8 +242,7 @@ int main(int argc, char* argv[]) {
if (strcmp(argv[1], "-h") == 0) { if (strcmp(argv[1], "-h") == 0) {
printf("syntax: %s <port>\n\n",argv[0]); printf("syntax: %s <port>\n\n",argv[0]);
printf("\tLinux example:'%s /dev/ttyACM0'\n\n", argv[0]); printf("\tLinux example:'%s /dev/ttyACM0'\n\n", argv[0]);
offline = 2; dumpAllHelp();
dumphelp();
return 0; return 0;
} }
// Make sure to initialize // Make sure to initialize