我正在尝试实现具有特定于我的应用程序的 cmd 的自定义 cmd 行。
命令是单个单词或多个单词。比如说
-#version //single word cmd
-#show input pressure //Multiple word cmds
-#show input temp
为了解析和调用相应的函数指针,我有两个用于上述 cmd 的表。
表 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 个 cmds 属于表 1 中的“显示输入”。
在当前算法中,在将输入字符串拆分为标记时,我检查它是单字还是双字。如果是单个单词,我直接调用该函数。如果有多个单词(例如显示输入温度),我会采用前 2 个标记(即“显示输入”并尝试在子表中过滤和搜索。(这里是它的表 2)。
/*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 我比较并找到“显示网络”一旦匹配然后我搜索具有网络命令的 table3。
其他一些 cmds 就像
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 。
如何改进这个算法?如果有更好的解决方案,请建议我。谢谢。