]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdparser.c
   1 //----------------------------------------------------------------------------- 
   2 // Copyright (C) 2010 iZsh <izsh at fail0verflow.com> 
   4 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   5 // at your option, any later version. See the LICENSE.txt file for the text of 
   7 //----------------------------------------------------------------------------- 
   9 //----------------------------------------------------------------------------- 
  15 #include "cmdparser.h" 
  16 #include "proxmark3.h" 
  18 void CmdsHelp(const command_t Commands
[]) 
  20   if (Commands
[0].Name 
== NULL
) 
  23   while (Commands
[i
].Name
) 
  25     if (!offline 
|| Commands
[i
].Offline
) 
  26        PrintAndLog("%-16s %s", Commands
[i
].Name
, Commands
[i
].Help
); 
  31 void CmdsLS(const command_t Commands
[]) 
  33   if (Commands
[0].Name 
== NULL
) return; 
  35   while (Commands
[i
].Name
) 
  37     if (!offline 
|| Commands
[i
].Offline
) 
  38        PrintAndLog("%-16s", Commands
[i
].Name
); 
  43 void CmdsParse(const command_t Commands
[], const char *Cmd
) 
  45   if(strcmp( Cmd
, "XX_internal_command_dump_XX") == 0) 
  46   {// Help dump children 
  47       dumpCommandsRecursive(Commands
, 0); 
  50   if(strcmp( Cmd
, "XX_internal_command_dump_markdown_XX") == 0) 
  51   {// Markdown help dump children 
  52       dumpCommandsRecursive(Commands
, 1); 
  57   memset(cmd_name
, 0, 32); 
  58   sscanf(Cmd
, "%31s%n", cmd_name
, &len
); 
  60   while (Commands
[i
].Name 
&& strcmp(Commands
[i
].Name
, cmd_name
)) 
  63   /* try to find exactly one prefix-match */ 
  64   if(!Commands
[i
].Name
) { 
  68     for(i
=0;Commands
[i
].Name
;i
++) { 
  69       if( !strncmp(Commands
[i
].Name
, cmd_name
, strlen(cmd_name
)) ) { 
  74     if(matches 
== 1) i
=last_match
; 
  77   if (Commands
[i
].Name
) { 
  78     while (Cmd
[len
] == ' ') 
  80     Commands
[i
].Parse(Cmd 
+ len
); 
  82     // show help for selected hierarchy or if command not recognised 
  87 char pparent
[512] = {0}; 
  88 char *parent 
= pparent
; 
  90 void dumpCommandsRecursive(const command_t cmds
[], int markdown
) 
  92   if (cmds
[0].Name 
== NULL
) 
  98   // First, dump all single commands, which are not a container for  
 101     printf("|%-*s|%-*s|%s\n",w_cmd
,"command",w_off
,"offline","description"); 
 102     printf("|%-*s|%-*s|%s\n",w_cmd
,"-------",w_off
,"-------","-----------"); 
 104     printf("%-*s|%-*s|%s\n",w_cmd
,"command",w_off
,"offline","description"); 
 105     printf("%-*s|%-*s|%s\n",w_cmd
,"-------",w_off
,"-------","-----------"); 
 110     char* cmd_offline 
= "N"; 
 111     if(cmds
[i
].Help
[0] == '{' && ++i
) continue; 
 113     if ( cmds
[i
].Offline
) cmd_offline 
= "Y"; 
 115       printf("|`%s%-*s`|%-*s|`%s`\n", parent
, w_cmd
-(int)strlen(parent
)-2, cmds
[i
].Name
, w_off
, cmd_offline
, cmds
[i
].Help
); 
 117       printf("%s%-*s|%-*s|%s\n", parent
, w_cmd
-(int)strlen(parent
), cmds
[i
].Name
, w_off
, cmd_offline
, cmds
[i
].Help
); 
 122   // Then, print the categories. These will go into subsections with their own tables 
 126     if(cmds
[i
].Help
[0] != '{' && ++i
)  continue; 
 128     printf("### %s%s\n\n %s\n\n", parent
, cmds
[i
].Name
, cmds
[i
].Help
); 
 130     char currentparent
[512] = {0}; 
 131     snprintf(currentparent
, sizeof currentparent
, "%s%s ", parent
, cmds
[i
].Name
); 
 132     char *old_parent 
= parent
; 
 133     parent 
= currentparent
; 
 134     // This is what causes the recursion, since commands Parse-implementation 
 135     // in turn calls the CmdsParse above.  
 137       cmds
[i
].Parse("XX_internal_command_dump_markdown_XX"); 
 139       cmds
[i
].Parse("XX_internal_command_dump_XX");