GETSUBOPT(3)

名称
getsubopt - 引数からサブオプションを取得

ライブラリ
libc

書式
<unistd.h> extern char *suboptarg; int getsubopt(char **optionp, char * const *tokens, char **valuep)

解説
getsubopt() 関数は、 1 つまたは複数のタブ、スペースまたはコンマ (‘’), キャラクタによって区切られたトークンが含まれる文字列を解析します。 ユーティリティのコマンドラインの一部として入力される、 オプション引数のまとまりを解析するのに使用するのが目的です。

引数 optionp は、文字列へのポインタを指すポインタです。 引数 tokens は、文字列へのポインタを持つ、 NULL で終わる配列を指すポインタです。

getsubopt() 関数は、文字列の最初のトークンに適合する文字列を参照する tokens 配列中のポインタの、0 始まりのオフセットを返します。 文字列にトークンが一切含まれない、または tokens 中に適合する文字列が含まれない場合には -1 を返します。

トークンの形式が ``name=value'' である場合、 valuep で参照される先は、 トークンの ``value'' の部分の先頭を指すように設定されます。

getsubopt() から戻った時、 optionp が文字列の次のトークンの先頭を指すように設定されます。 または、それ以上のトークンがない場合には、 文字列の終わりの null を指します。 外部変数 suboptarg は、現在のトークンの先頭を指すように設定されます。 トークンがなかった場合は、 NULL となります。 引数 valuep は、トークンの ``value'' の部分を示すように設定されます。 または、``value'' 部分がなかった場合は NULL となります。

使用例
    char *tokens[] = {
    	#define ONE	0
    		"one",
    	#define TWO	1
    		"two",
    	NULL
    };
    ...
    extern char *optarg, *suboptarg;
    char *option, *value;
    while ((ch = getopt(argc, argv, "ab:")) != -1) {
    	switch(ch) {
    	case 'a':
    		/*  ``a'' オプションを処理 */
    		break;
    	case 'b':
    		option = optarg;
    		while (*option) {
    			switch(getsubopt(&option, tokens, &value)) {
    			case ONE:
    				/* ``one'' サブオプションを処理 */
    				break;
    			case TWO:
    				/* ``two'' サブオプションを処理 */
    				if (!value)
    					error("no value for two");
    				i = atoi(value);
    				break;
    			case -1:
    				if (suboptarg)
    					error("illegal sub option %s",
    					  suboptarg);
    				else
    					error("missing sub option");
    				break;
    		}
    		break;
    	}

関連項目
getopt(3), strsep(3)

歴史
getsubopt() 関数は 4.4BSD ではじめて登場しました。