拡張機能の引数の解析
EngExtCpp 拡張フレームワークには、拡張機能に渡されるコマンド ライン引数の解析を支援するメソッドが用意されています。 これらのメソッドを利用するには、拡張機能で最初にコマンド ライン引数の形式を EXT_COMMAND マクロで宣言する必要があります。
フレームワークによって実行されるコマンド ライン引数の解析をバイパスし、拡張機能自体が引数を解析できるようにするには、コマンド ラインの説明を GetRawArgStr メソッドに "{{custom}}"
設定し、 GetRawArgStr メソッドを使用して解析用のコマンド ライン引数を取得します。
コマンド ライン記述文字列は、表示の列幅に合わせて、印刷時に自動的にラップされます。 ただし、改行を記述文字列に埋め込むことができます 。'\n
' を使用して改行を開始します。
コマンド ラインの説明には 、NULL または空の文字列を指定できます。 いずれかの場合は、拡張コマンドが引数を受け取らないことを示します。
コマンド ラインの説明
コマンド ライン引数の説明は、ディレクティブと引数の 2 種類のコンポーネントを含むシーケンスです。 説明には、必要に応じて各ディレクティブのいずれかを含め、最大 64 個の引数を含めることができます。
ディレクティブ
ディレクティブは、引数の解析方法を指定します。 二重中かっこ ('{{'
および '}}'
) で囲まれています。 各ディレクティブは、必要に応じて、引数を記述する文字列に 0 回または 1 回出現できます。
次のディレクティブが使用可能です。
custom
拡張機能フレームワークによって実行される解析をオフにし、拡張機能が独自の解析を実行できるようにします。
l:str
コマンド ライン引数の既定の長い説明をオーバーライドします。 拡張機能フレームワークでは、すべての引数の完全な説明に str を使用します。
opt:str
名前付きコマンドの既定のプレフィックス文字をオーバーライドします。 既定値は "/-"
、名前付き引数を識別するプレフィックスとして '/
' または '-
' を使用できるようにします。
s:str
コマンドライン引数のデフォルトの短い説明をオーバーライドします。 拡張フレームワークは、すべての引数の短い説明に str を使用します。
以下にディレクティブの例をいくつか示します。 次の文字列は、独自の引数を解析する拡張コマンドで使用されます。 また、自動 !help 拡張機能コマンドで使用するための短い説明と長い説明も提供します。
{{custom}}{{s:<arg1> <arg2>}}{{l:arg1 - Argument 1\narg2 - Argument 2}}
次の文字列は、引数オプションのプレフィックス文字を '' または '/
-
' に変更します。 このディレクティブでは、引数は '' と '' の代わりに '+arg
' と ':arg
'/arg
を-arg
'使用して指定されます。
{{opt:+:}}
引数
引数には、名前付きと名前なしの 2 つの型を指定できます。 名前のない引数は位置的に読み取られます。 どちらの種類の引数にも表示名があり、ヘルプ コマンドで使用されます。
引数の説明は、単一の中かっこ ('{'
および '}'
) で囲まれています。
各引数の説明には、次の構文があります。
{[optname];[type[,flags]];[argname];[argdesc]}
どこで:
optname
引数の名前。 これは、コマンドおよび名前で引数をフェッチするメソッドで使用される名前です。 この名前は省略可能です。 引数が存在する場合、引数は "名前付き引数" になります。コマンド ライン上の任意の場所に表示でき、名前で参照されます。 存在しない場合、引数は "名前のない引数" になります。コマンド ラインでの位置は重要であり、他の名前のない引数に対する相対位置によって参照されます。
type
引数の型。 これは、引数の解析方法と取得方法に影響します。 type パラメータには、次のいずれかの値を指定できます。
b
ブール型。 引数が存在するか、存在しないかのどちらかです。 名前付きブール型の引数は、 HasArg を使用して取得できます。
e[d][s][bits]
式の種類. 引数に数値があります。 名前付き式の引数は GetArgU64 を使用して取得でき、名前のない式の引数は GetUnnamedArgU64 を使用して取得できます。
d
式は、引数文字列内の次のスペース文字に制限されます。 これが存在しない場合、式エバリュエーターは、式の末尾に達したと判断するまで、コマンド ラインから文字を使用します。
s
式の値は符号付きです。 それ以外の場合、式の値は符号なしです。
ビット
引数の値内のビット数。 ビット の最大値は 64 です。
s
文字列型。 文字列は次のスペース文字に制限されます。 名前付き文字列引数は GetArgStr を使用して取得でき、名前のない文字列引数は GetUnnamedArgStr を使用して取得できます。
x
文字列型。 引数は、コマンド ラインの残りの部分です。 引数は、s 文字列型と同様に、 GetArgStr または GetUnnamedArgStr を使用して取得されます。
flags
引数flags. これらは、パーサーによる引数の処理方法を決定します。 flags パラメータには、次のいずれかの値を指定できます。
d=expr
引数のデフォルト値。 引数がコマンド ラインに存在しない場合、引数は expr に設定されます。 既定値は、引数の型に従って解析される文字列です。
ds
既定値は、ヘルプによって提供される引数の説明には表示されません。
o
引数は省略可能です。 これは、名前付き引数の既定値です。
r
引数は必須です。 これは、名前のない引数のデフォルトです。
argname
引数の表示名。 これは、自動 !help 拡張コマンドと、自動 /? または -? コマンド ライン引数によって使用される名前です。 コマンド ライン オプションの概要を印刷するときに使用します。
argdesc
引数の説明。 これは、自動 !help 拡張機能と、自動"/?"または "-?" コマンドライン引数によって出力される説明です。
引数の説明の例をいくつか次に示します。 次の式は、単一の省略可能な式引数を受け取るコマンドを定義します。 引数は 32 ビットに収まる必要があります。 引数がコマンド ラインに存在しない場合は、0x100の既定値が使用されます。
{;e32,o,d=0x100;flags;Flags to control command}
次の式は、省略可能なブール値 "/v" 引数と必須の名前のない文字列引数を持つコマンドを定義します。
{v;b;;Verbose mode}{;s;name;Name of object}
次の式は、省略可能な名前付き式引数 /oname expr および省略可能な名前付き文字列引数 /eol str を持つコマンドを定義します。 /eol が存在する場合、その値はコマンド ラインの reメインder に設定され、それ以上の引数は解析されません。
{oname;e;expr;Address of object}{eol;x;str;Commands to use}
コマンド ライン
コマンド ラインで引数を解析する方法の一覧を次に示します。
名前付き式と文字列引数の値は、コマンド ラインの名前に従います。 たとえば、 /name expr や /name strなどです。
名前付きブール型引数の場合、コマンド ラインに名前が表示される場合、値は true になります。それ以外の場合は false。
コマンド ラインでは、複数の単一文字名のブール型オプションをグループ化できます。 たとえば、"/a /b /c" は、短縮形表記 "/abc" を使用して記述できます ("abc" という名前の引数が既にある場合を除く)。
コマンド ラインに名前付き引数 "?" ("/?" や "-?" など) が含まれている場合は、引数の解析が終了し、拡張機能のヘルプ テキストが表示されます。
内部の解析
引数パーサーは、引数を設定するためにいくつかのメソッドを使用します。
SetUnnamedArg メソッドは、名前のない引数の値を変更します。 また、便宜上、 SetUnnamedArgStr メソッドと SetUnnamedArgU64 メソッドは、それぞれ名前のない文字列と式の引数を設定します。
名前付き引数にも同様のメソッドが存在します。 SetArg は名前付き引数の値を変更するために使用され、 SetArgStr と SetArgU64 はそれぞれ名前付き文字列引数と式引数に使用されます。