2017-12-09 17 views
1

私のCプログラムでコマンドラインオプションを解析するのにargpを使いたいです。GNU argp:長い名前だけでオプションを解析する方法は?

オプションは、短い名前(-f barなど)ではなく、長い名前(--foo=barなど)のみを持つという要件の1つです。

argp_option構造体のkeyフィールドを0に設定して、短い名前を表示しないようにすることです。

詳細はthe provided examplesとですが、argpに与えられたパーサー関数で長い名前しか持てないオプションを解析する方法が見つかりません。私が見つけた何

は理論的には、パーサに私は長いオプション(--foo=barで呼び出されたときに、例えば、barがここに印刷される)のを見つけるために

case ARGP_KEY_ARG: 
    printf("%s\n", arg); 

を使用することができ、ということです。しかし、これは正しいアプローチのようには思えません。私は、値がどのオプションに属しているかを実際に簡単に知る方法がないからです。実際のコマンドライン引数(オプション値ではありません)も表示されます。

私はどこを見なければならないかについてのヒントに感謝します。乾杯。 "The GNU C Library: Argp Option Vectors — Specifying Options in an Argp Parser"から

+0

負の数(たとえば、「-1」)を「短い」オプションとして使用し、それをスイッチで処理できます。 – keltar

+1

オプションの 'key'フィールドには任意の' int'値を指定できます。 'isascii(key)'が真である場合、 'key'は短いオプション' -char'( 'char'は文字コード' key'に関連する文字です)であることをドキュメントは述べています。技術的には、 'isascii'は' 0x00 <= key && key <0x80'を保証するので、その範囲外の 'int'値をキーに使うことができます。この 'key 'は関連するロングオプション(' --foo'など)の値として引き続き使用されるため、任意のキー/ショートoptと同じように扱います。ところで、私はすべてのオプションキーを定数として 'enum'で集めているので、' switch 'に何のオプション '0x100'があるのか​​不思議ではありません;-) –

+0

@ChronoKitsuneそれは答え、狐を作ることができます。 Btw、キーとして '-opt'を使わないのはなぜですか(私は、短いオプションになる*否定的な値)。例えば。 's'と' d 'が意味のある短いオプションであれば、絶対値> 0x80を持つ '-'s''と' -'d''を使います。 –

答えて

2

int key

オプションパーサへの現在のオプションが提供する整数keykeyは、印刷可能なASCII文字(すなわち、 isascii (key)が真である)である値を持っている場合、それはまた、charは、コードkeyとASCII文字で短いオプション-char、 を指定します。言い換えれば

、オプションのkeyフィールドは、任意のint値にすることができ、かつisascii(key)がゼロであれば、それはまた、あなたが範囲は0x00外で非ASCII値(値を使用することができることを意味し、短いオプション—を指定します..0x7F)を使用して短いオプションを回避します。短いオプションではないにもかかわらず、関連付けられたロングオプション(例:--foo)の値としてkeyの値が引き続き使用されるため、どのキー/ショートオプションと同じように扱います。

O/T:enumのすべてのオプションキーを定数として収集していますので、0x100のオプションがswitchで表されています。 GNU tarのために、それは、その圧縮オプションのためにこのようなものかもしれません:

enum compress_options { 
    // Archive file extension determines compression program 
    COMP_FILTER_AUTO = 'a', 
    // Option arg is program used to deal with compression 
    COMP_FILTER_ARG = 'I', 

    COMP_FILTER_BZIP2 = 'j', 
    COMP_FILTER_XZ = 'J', 
    COMP_FILTER_GZIP = 'z', 
    COMP_FILTER_COMPRESS = 'Z', 

    COMP_FILTER_LZIP = 0x100, 
    COMP_FILTER_LZMA, 
    COMP_FILTER_LZOP, 

    // Do not use archive suffix to determine compression program. 
    COMP_FILTER_NOAUTO, 
}; 

次に、あなただけのオプションの次のセットを持つオプションの問題を回避するために0x200、その後0x300などを使用していることを保証するために必要があるだろう同じ値。必要に応じて、0x1000x1800x2000x280など(例:0x100はサブコマンドを表し、0x180はそのサブコマンドの最初のオプションです)。

ショートオプションと非ショートオプションを別々にグループ化することが重要です。 enumの暗黙的に割り当てられた値は、最後に明示的に割り当てられた値の値に依存します。私がCOMP_FILTER_AUTOの直後にCOMP_FILTER_NOAUTOを置いた場合、--no-auto-compressロングオプションは関連するショートオプション-bを持っていましたが、それは実際にはありません。

+0

ありがとう、それは私の質問に答える。私は実際には、その範囲外の値を使用してスイッチのケースでそれらの値を比較することはできないと思っていました。私はCプログラミングのこの程度の「自由」(意味論的な曖昧さ)に慣れていない。 – ngmir

+0

追加のメモをありがとう、私はいくつかの洞察に満足しています。私もこの考えを統合しました。 – ngmir

関連する問題