我正在尝试使用特定于我的应用程序的cmd的自定义cmd行的实现。
命令可以是单个单词,也可以是多个单词。 比如说。
-#version //single word cmd
-#show input pressure //Multiple word cmds
-#show input temp
为了解析和调用相应的函数指针,我有两个表用于上面的cmds。
表1:基本Cmd表
typedef struct CommandStruct{
char (*f)(uint8 argn, const char **argv);
char *fname;
char *help;
}CommandStruct;
/*Help information*/
char version_help[] = " Usage:Version \n Command Displays the version information.\n";
char ShowInput_help[] = " \nUsage: \n show input pressure --Shows input pressure \n \
show input temp -- shows input temperature \n";
/*Table1 - Basic set of commands*/
CommandStruct basic_command_list[] =
{
/* function name , cmd name , help information */
{version , "version" , version_help },
{clear , "clear" ,"Clear the screen" },
{quit , "quit" ,"Exit from the prompt" },
{ShowInput , "show input", ShowInput_help },
{NULL , NULL , NULL }
};
-#show input pressure
-#show input temp
以上2 cmd属于table1中的“show input”。
在当前算法中,在将输入字符串拆分为标记时,我会检查它是单个字还是双字。在单个单词的情况下,我直接调用该函数。 如果有多个单词(例如Show输入temp),我会取前2个标记(即'show input'并尝试在子表中进行过滤和搜索。(此处为table2)。
/*Table 2 : Sub cmd for the cmds starting with 'show input' */
CommandStruct show_input_command_list[] =
{
/* function name , cmd name , help information */
{ShowInputPressure , "pressure", ShowInput_help },
{ShowInputTemp , "temp",ShowInput_help},
{NULL , NULL , NULL }
};
这样我继续说下面的cmds我比较并找到“show network”一旦匹配然后我搜索具有网络命令的table3。
其他一些cmd就像
show network ipaddress
show network ipsubnet
show network abcd<#>
set network ipaddress <#>
set network ipsubnet <#>
set network abcd <#> <#>
所以我必须将ShowNetwork添加到表1并创建一个新表show_network_command_list []并添加另外三个cmd .etc。
如何改进此算法?如果有更好的解决方案,请建议我。感谢。