アプリケーションに固有のコマンドを持つカスタムコマンドラインの実装を試みています。
コマンドは、単一の単語または複数の単語のいずれかです。たとえば
-#version //single word cmd
-#show input pressure //Multiple word cmds
-#show input temp
対応する関数ポインタを解析して呼び出すために、上記の cmd 用に 2 つのテーブルがあります。
表1:基本コマンド テーブル
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 つのコマンドは、table1 の「show input」に該当します。
現在のアルゴリズムでは、入力文字列をトークンに分割する際に、それが 1 つの単語か 2 つの単語かをチェックします。単一の単語の場合、関数を直接呼び出します。複数の単語 (例: Show input 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 }
};
このようにして、以下のコマンドを比較し、一致したら「show network」を見つけてから、ネットワークコマンドを含むtable3を検索します。
他のいくつかのコマンドは次のようになります
show network ipaddress
show network ipsubnet
show network abcd<#>
set network ipaddress <#>
set network ipsubnet <#>
set network abcd <#> <#>
したがって、テーブル 1 に ShowNetwork を追加し、新しいテーブル show_network_command_list[] を作成して、他の 3 つの cmd .etc を追加する必要があります。
このアルゴリズムを改善するには? より良い解決策があれば教えてください。ありがとう。