]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdparser.c
e67bdfe54fdaedf28b5cb15d32ff2e08a91b0b21
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 int 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 return Commands
[i
].Parse(Cmd
+ len
);
82 // show help for selected hierarchy or if command not recognised
89 char pparent
[512] = {0};
90 char *parent
= pparent
;
92 void dumpCommandsRecursive(const command_t cmds
[], int markdown
)
94 if (cmds
[0].Name
== NULL
)
100 // First, dump all single commands, which are not a container for
103 printf("|%-*s|%-*s|%s\n",w_cmd
,"command",w_off
,"offline","description");
104 printf("|%-*s|%-*s|%s\n",w_cmd
,"-------",w_off
,"-------","-----------");
106 printf("%-*s|%-*s|%s\n",w_cmd
,"command",w_off
,"offline","description");
107 printf("%-*s|%-*s|%s\n",w_cmd
,"-------",w_off
,"-------","-----------");
112 char* cmd_offline
= "N";
113 if(cmds
[i
].Help
[0] == '{' && ++i
) continue;
115 if ( cmds
[i
].Offline
) cmd_offline
= "Y";
117 printf("|`%s%-*s`|%-*s|`%s`\n", parent
, w_cmd
-(int)strlen(parent
)-2, cmds
[i
].Name
, w_off
, cmd_offline
, cmds
[i
].Help
);
119 printf("%s%-*s|%-*s|%s\n", parent
, w_cmd
-(int)strlen(parent
), cmds
[i
].Name
, w_off
, cmd_offline
, cmds
[i
].Help
);
124 // Then, print the categories. These will go into subsections with their own tables
128 if(cmds
[i
].Help
[0] != '{' && ++i
) continue;
130 printf("### %s%s\n\n %s\n\n", parent
, cmds
[i
].Name
, cmds
[i
].Help
);
132 char currentparent
[512] = {0};
133 snprintf(currentparent
, sizeof currentparent
, "%s%s ", parent
, cmds
[i
].Name
);
134 char *old_parent
= parent
;
135 parent
= currentparent
;
136 // This is what causes the recursion, since commands Parse-implementation
137 // in turn calls the CmdsParse above.
139 cmds
[i
].Parse("XX_internal_command_dump_markdown_XX");
141 cmds
[i
].Parse("XX_internal_command_dump_XX");