diff --git a/client/cmdparser.c b/client/cmdparser.c index 5d0363aca..eea1e5467 100644 --- a/client/cmdparser.c +++ b/client/cmdparser.c @@ -11,6 +11,7 @@ #include #include #include +#include "util.h" #include "ui.h" #include "cmdparser.h" #include "proxmark3.h" @@ -25,49 +26,48 @@ void CmdsHelp(const command_t Commands[]) { } } +int CmdsParse(const command_t Commands[], const char *Cmd) { + // Help dump children + if (strcmp( Cmd, "XX_internal_command_dump_XX") == 0) { + dumpCommandsRecursive(Commands, 0); + return 0; + } + // Markdown help dump children + if(strcmp( Cmd, "XX_internal_command_dump_markdown_XX") == 0) { + dumpCommandsRecursive(Commands, 1); + return 0; + } + char cmd_name[64]; + int len = 0; + memset(cmd_name, 0, sizeof(cmd_name)); + sscanf(Cmd, "%63s%n", cmd_name, &len); + str_lower(cmd_name); + int i = 0; + while (Commands[i].Name && strcmp(Commands[i].Name, cmd_name)) + ++i; -int CmdsParse(const command_t Commands[], const char *Cmd) -{ - if(strcmp( Cmd, "XX_internal_command_dump_XX") == 0) - {// Help dump children - dumpCommandsRecursive(Commands, 0); - return 0; - } - if(strcmp( Cmd, "XX_internal_command_dump_markdown_XX") == 0) - {// Markdown help dump children - dumpCommandsRecursive(Commands, 1); - return 0; - } - char cmd_name[32]; - int len = 0; - memset(cmd_name, 0, sizeof(cmd_name)); - sscanf(Cmd, "%31s%n", cmd_name, &len); - int i = 0; - while (Commands[i].Name && strcmp(Commands[i].Name, cmd_name)) - ++i; + /* try to find exactly one prefix-match */ + if (!Commands[i].Name) { + int last_match = 0; + int matches = 0; - /* try to find exactly one prefix-match */ - if(!Commands[i].Name) { - int last_match = 0; - int matches = 0; + for (i=0; Commands[i].Name;i++) { + if( !strncmp(Commands[i].Name, cmd_name, strlen(cmd_name)) ) { + last_match = i; + matches++; + } + } + if(matches == 1) i = last_match; + } - for(i=0;Commands[i].Name;i++) { - if( !strncmp(Commands[i].Name, cmd_name, strlen(cmd_name)) ) { - last_match = i; - matches++; - } - } - if(matches == 1) i=last_match; - } - - if (Commands[i].Name) { - while (Cmd[len] == ' ') - ++len; - return Commands[i].Parse(Cmd + len); - } else { - // show help for selected hierarchy or if command not recognised - CmdsHelp(Commands); - } + if (Commands[i].Name) { + while (Cmd[len] == ' ') + ++len; + return Commands[i].Parse(Cmd + len); + } else { + // show help for selected hierarchy or if command not recognised + CmdsHelp(Commands); + } return 0; } @@ -75,58 +75,56 @@ int CmdsParse(const command_t Commands[], const char *Cmd) char pparent[512] = {0}; char *parent = pparent; -void dumpCommandsRecursive(const command_t cmds[], int markdown) -{ - if (cmds[0].Name == NULL) - return; +void dumpCommandsRecursive(const command_t cmds[], int markdown) { + if (cmds[0].Name == NULL) + return; - int i = 0; - int w_cmd=25; - int w_off=8; - // First, dump all single commands, which are not a container for - // other commands - if (markdown) { - printf("|%-*s|%-*s|%s\n",w_cmd,"command",w_off,"offline","description"); - printf("|%-*s|%-*s|%s\n",w_cmd,"-------",w_off,"-------","-----------"); - } else { - printf("%-*s|%-*s|%s\n",w_cmd,"command",w_off,"offline","description"); - printf("%-*s|%-*s|%s\n",w_cmd,"-------",w_off,"-------","-----------"); - } + int i = 0; + int w_cmd = 25; + int w_off = 8; + // First, dump all single commands, which are not a container for + // other commands + if (markdown) { + printf("|%-*s|%-*s|%s\n",w_cmd,"command",w_off,"offline","description"); + printf("|%-*s|%-*s|%s\n",w_cmd,"-------",w_off,"-------","-----------"); + } else { + printf("%-*s|%-*s|%s\n",w_cmd,"command",w_off,"offline","description"); + printf("%-*s|%-*s|%s\n",w_cmd,"-------",w_off,"-------","-----------"); + } - while (cmds[i].Name) - { - char* cmd_offline = "N"; - if(cmds[i].Help[0] == '{' && ++i) continue; + while (cmds[i].Name) { + char* cmd_offline = "N"; + if (cmds[i].Help[0] == '{' && ++i) continue; - if ( cmds[i].Offline) cmd_offline = "Y"; - if (markdown) - printf("|`%s%-*s`|%-*s|`%s`\n", parent, w_cmd-(int)strlen(parent)-2, cmds[i].Name, w_off, cmd_offline, cmds[i].Help); - else - printf("%s%-*s|%-*s|%s\n", parent, w_cmd-(int)strlen(parent), cmds[i].Name, w_off, cmd_offline, cmds[i].Help); - ++i; - } - printf("\n\n"); - i=0; - // Then, print the categories. These will go into subsections with their own tables + if ( cmds[i].Offline) + cmd_offline = "Y"; + if (markdown) + printf("|`%s%-*s`|%-*s|`%s`\n", parent, w_cmd-(int)strlen(parent)-2, cmds[i].Name, w_off, cmd_offline, cmds[i].Help); + else + printf("%s%-*s|%-*s|%s\n", parent, w_cmd-(int)strlen(parent), cmds[i].Name, w_off, cmd_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; - while (cmds[i].Name) - { - if(cmds[i].Help[0] != '{' && ++i) continue; + printf("### %s%s\n\n %s\n\n", parent, cmds[i].Name, cmds[i].Help); - printf("### %s%s\n\n %s\n\n", 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; - // This is what causes the recursion, since commands Parse-implementation - // in turn calls the CmdsParse above. - if (markdown) - cmds[i].Parse("XX_internal_command_dump_markdown_XX"); - else - cmds[i].Parse("XX_internal_command_dump_XX"); - parent = old_parent; - ++i; - } + char currentparent[512] = {0}; + snprintf(currentparent, sizeof currentparent, "%s%s ", parent, cmds[i].Name); + char *old_parent = parent; + parent = currentparent; + // This is what causes the recursion, since commands Parse-implementation + // in turn calls the CmdsParse above. + if (markdown) + cmds[i].Parse("XX_internal_command_dump_markdown_XX"); + else + cmds[i].Parse("XX_internal_command_dump_XX"); + parent = old_parent; + ++i; + } } diff --git a/client/util.c b/client/util.c index 5f2ce0ea8..283d15910 100644 --- a/client/util.c +++ b/client/util.c @@ -664,8 +664,7 @@ uint64_t HornerScheme(uint64_t num, uint64_t divider, uint64_t factor) { } // determine number of logical CPU cores (use for multithreaded functions) -extern int num_CPUs(void) -{ +extern int num_CPUs(void) { #if defined(_WIN32) #include SYSTEM_INFO sysinfo; @@ -677,4 +676,9 @@ extern int num_CPUs(void) #else return 1; #endif +} + +extern void str_lower(char *s ){ + for(int i=0; i < strlen(s); i++) + s[i] = tolower( s[i] ); } \ No newline at end of file diff --git a/client/util.h b/client/util.h index 1a9a0c1f8..f3bf18dd3 100644 --- a/client/util.h +++ b/client/util.h @@ -142,4 +142,6 @@ extern uint32_t reflect(uint32_t v, int b); extern uint64_t HornerScheme(uint64_t num, uint64_t divider, uint64_t factor); extern int num_CPUs(void); // number of logical CPUs + +extern void str_lower(char* s); // converts string to lower case #endif \ No newline at end of file