Command Line Options Library

Introduction

CmdOpt は, コマンドラインオプションを解釈するためのライブラリです.

こんなものを使わずに,おとなしく getopt を使いましょう.

Source

CmdOpt は存在自体がネタに近いです.

cmdopt.tgz - 2,415 bytes

MinGW gcc 3.4.2 で動作確認をしています.

Update

December 28, 2006
気の迷いから公開しておくことにしました.

Structures

cmdopt.h からの抜粋になりますが, 以下のような構造体を提供します.

// 長いオプション
typedef    struct LongOpt
{
  const char  *name;     // オプションの名前(NULL ならば終端と判断する)
  int          has_arg;  // オプションが引数を受け取るかどうか
                         // 引数なし(0),引数あり(1),どちらでも可 (2)
  int         *flag;     // NULL でなければ *flag を val で上書き
  int          val;       // このオプションが見つかったときに返す値
}  LongOpt, *hLongOpt;
// Command line option.
typedef    struct CmdOpt
{
  // コマンドライン引数
  int     argc;
  char  **argv;

  // コマンドラインオプションを解釈するための設定
  const LongOpt  *longopts;   // 長いオプション
  const char     *optstring;  // 短いオプション

  // Status.
  int    optind;     // 次に解釈するオプションのインデックス
  char  *nextchar;   // 次に解釈する文字
  char  *optarg;     // オプションの引数
  int    optopt;     // オプション文字
  char  *optlong;    // 一致した長いオプション
  int    opterr;     // 警告レベル
                     // なし(0),エラー出力(1),すべて出力(2)
  int    longindex;  // 一致した長いオプションのインデックス
  int    optnum;     // オプションの数
}  CmdOpt, *hCmdOpt;

getopt と似たような 動作が得られるように作成してあり, 構造体のメンバの多くは getopt で使用されている同名の変数と同様の意味を持ちます. 完全に同じではないところが紛らわしいです. 実際のところ,getopt の実装はまったく調べていません.

Functions

cmdopt.h からの抜粋になりますが, 以下のような関数を提供します.

// コマンドラインオプションを前方から一つずつ解釈
int  CmdOpt_Get( hCmdOpt h );

一致したオプション文字もしくは長いオプションの返り値を返します. すべての引数を解釈し終われば -1 を返します. 不明なオプション文字や長いオプションを見つけた場合は `?' を返し, 引数の過不足がある場合は `:' を返します.

// コマンドラインオプションを解釈するための初期化
void CmdOpt_Init( hCmdOpt h, int argc, char **argv,
                  const char *optstring, const LongOpt *longopts );

解釈の準備をするための関数です. argcargv には main の引数をそのまま渡します. optstring には オプションと解釈する文字を渡します. オプション文字の後ろに `:'(コロン)をつけると, そのオプションは引数を受け取るようになります. "::" をつけると, そのオプションは引数を受け取っても受け取らなくてもよくなります.

longopts には 受け取る長いオプションの配列を渡します. 必要がなければ NULL を渡すか, 最初の要素の nameNULL にしておきます.

Sample

sample.c を参考にしてください.

To Do

何の予定もありません.

References

getopt のマニュアルを参考にしました.

Back
Last-Modified: December 28, 2006