0

我正在尝试实现具有特定于我的应用程序的 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 。

如何改进这个算法?如果有更好的解决方案,请建议我。谢谢。

4

0 回答 0