# OS_GetOpt*

## 構文

      #include <nitro/os.h>

      int         OS_GetOpt( const char* optstring );
      int         OS_GetOptInd( void );
      const char *OS_GetOptArg( void );
      int         OS_GetOptOpt( void );

## 引数

optstring | 受け付けるオプション文字を示す文字列

## 返り値

発見したコマンドラインオプションの情報。(次項を参照)

## 説明

`OS_GetArgc()`, `OS_GetArgv()` で取得できるコマンドライン引数情報を分析して、オプションに関する情報を取得します。

`OS_GetOpt()` は与えられた optstring 文字列に含まれる文字をオプションの識別文字と見なし、呼び出されるごとにコマンドライン引数を一つずつ、順に調査し、該当するオプションがある場合、そのオプション識別文字を返り値とします。

`OS_GetOpt()` が現在調査しているコマンドライン引数のインデックス値は `OS_GetOptInd()` で取得できます。

また、optstring 内の文字の後に `":"` あるいは `"::"` が付いている場合、そのオプションは引数を取ることを示します。このときオプション引数の情報を `OS_GetOptArg()` で取得することができます。`":"`はオプション引数が必須であることを示します。また `"::"` はオプション引数は省略可能であることを示します。オプション引数が省略されたときは `OS_GetOptArg()` は NULL を返します。

コマンドライン引数に optstring に含まれないオプションがあった場合、および `":"` による必須なオプション引数が無かった場合、`OS_GetOpt()` は文字コード `"?"` を返します。このときに原因となったオプションの識別文字は `OS_GetOptOpt()` で取得できます。

`OS_GetOpt()` がオプションでない通常のコマンドライン引数を発見したときの動作として2種類の振る舞いが選択可能です。これは optstring の先頭文字が `"-"` (マイナス文字)であるかそれ以外であるかによって切り替わります。

optstring の先頭文字がマイナス文字でない場合(デフォルト)、通常のコマンドライン引数を発見したとき、またはこれ以降のコマンドライン引数が無くなったときに `OS_GetOpt()`は返値として`-1` を返します。そして、この位置で引数の評価を終了し、以降の引数の調査を行ないません。`OS_GetOptInd()`の返値はこの最初に現れた通常引数のインデックス値を返すことになります。`OS_GetOptArg()` は `NULL` を返します。アプリケーションは `OS_GetOptInd()`で得られた値から`OS_GetArgc()-1` までの値を `OS_GetArgv()` のインデックスとして指定することによって、オプションを除いたコマンドライン引数を参照することができます。

以下にサンプルコードを示します。

>     BOOL 　      opt_b = FALSE;
>     const char*  opt_s = NULL;
>     const char*  opt_t = NULL;
>     int          argc  = OS_GetArgc();
>     int          c, i;

>     while ((c = OS_GetOpt("bs:t::")) > 0)
>     {
>             switch (c)
>             {
>             case 'b':       // スイッチ型のオプション
>                     opt_b = TRUE;
>                     break;

>             case 's':       // 引数が必須なオプション
>                     opt_s = OS_GetOptArg();
>                     break;

>             case 't':       // 引数が省略可能なオプション
>                     opt_t = OS_GetOptArg();
>                     break;

>             case '?':       // エラー処理
>             default:
>                     OS_Printf("Error --- option '%c'\n", OS_GetOptOpt());
>                     break;
>             }
>     }

>     // 通常のコマンドライン引数
>     for (i = OS_GetOptInd(); i < argc; i ++)
>     {
>             OS_Printf("ARG[%d]=%s\n", i, OS_GetArgv(i));
>     }

optstring の先頭文字がマイナス文字の場合、通常のコマンドライン引数を発見したとき、`OS_GetOpt()`は返値として `+1` を返します。この引数の値を `OS_GetOptArg()` で取得することができるため、アプリケーションは通常の引数を`OS_GetOpt()が`文字コード `1` のオプション文字のように扱うことができます。デフォルトの動作とは異なり、これ以降の引数についての調査は継続され、`OS_GetOptInd()`の返値は`OS_GetOpt()の呼出し毎に`次の引数のインデックス値へと変化します。調査が進み、以降の引数が無くなったときに`OS_GetOpt()は -1 を返します。`

以下にサンプルコードを示します。

>     BOOL 　      opt_b = FALSE;
>     const char*  opt_s = NULL;
>     const char*  opt_t = NULL;
>     int          c;

>     while ((c = OS_GetOpt("-bs:t::")) > 0)
>     {
>             switch (c)
>             {
>             case 1:        // 通常のコマンドライン引数
>                     OS_Printf("ARG=%s\n", OS_GetOptArg());
>                     break;

>             case 'b':       // スイッチ型のオプション
>                     opt_b = TRUE;
>                     break;

>             case 's':       // 引数が必須なオプション
>                     opt_s = OS_GetOptArg();
>                     break;

>             case 't':       // 引数が省略可能なオプション
>                     opt_t = OS_GetOptArg();
>                     break;

>             case '?':       // エラー処理
>             default:
>                     OS_Printf("Error --- option '%c'\n", OS_GetOptOpt());
>                     break;
>             }
>     }

## 参照

`OS_GetArgc, OS_GetArgv, buryarg ツール`

## 履歴

2005/09/06 調査動作切り替えについての解説を追加
2005/08/30 初版