Man page - getsubopt(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

GETSUBOPT

名 前
書 式
説 明
返 り 値
属 性
準 拠
注 意

関 連 項 目
こ の 文 書 に つ い て

名 前

getsubopt - 文 字 列 中 の サ ブ オ プ シ ョ ン 引 数 の 解 釈 を 行 う

書 式

#include <stdlib.h>

int getsubopt(char ** optionp , char * const * tokens , char ** valuep );

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 ( feature_test_macros (7) 参 照 ):

getsubopt ():

_XOPEN_SOURCE >= 500
|| /* glibc 2.12 以 降 : */ _POSIX_C_SOURCE >= 200809L

説 明

getsubopt () は 、 optionp で 与 え ら れ た カ ン マ 区 切 り の サ ブ オ プ シ ョ ン リ ス ト を 解 析 す る 。 (こ の よ う な サ ブ オ プ シ ョ ン リ ス ト は getopt (3) を 使 っ て コ マ ン ド ラ イ ン を 解 釈 し た 場 合 に 現 れ る こ と が 多 い 。 例 え ば 、 mount (8) の -o オ プ シ ョ ン を 見 る と よ い 。 ) そ れ ぞ れ の サ ブ オ プ シ ョ ン に は 対 応 す る 値 を 指 定 す る こ と が で き る 。 サ ブ オ プ シ ョ ン の 名 前 と 対 応 す る 値 は 等 号 ('=') で 区 切 ら れ る 。 例 え ば 、 以 下 の よ う な 文 字 列 を optionp に 渡 す こ と が で き る 。

ro,name=xyz

tokens 引 数 は ト ー ク ン へ の ポ イ ン タ ー の 配 列 へ の ポ イ ン タ ー で 、 配 列 は NULL で 終 端 さ れ る 。 getsubopt () は こ の ト ー ク ン を optionp 内 で 探 す 。 そ れ ぞ れ の ト ー ク ン は 、 NULL 終 端 さ れ た 1文 字 以 上 の 文 字 列 で 、 他 の ト ー ク ン と 区 別 で き る 必 要 が あ る 。 ま た 、 等 号 と カ ン マ を 含 ん で は な ら な い 。

getsubopt () は 呼 び 出 さ れ る た び に 、 optionp 中 の 次 の 未 処 理 の サ ブ オ プ シ ョ ン の 情 報 を 返 す 。 サ ブ オ プ シ ョ ン 内 に 等 号 が あ っ た 場 合 、 最 初 の 等 号 は そ の サ ブ オ プ シ ョ ン の 名 前 と 値 の 区 切 り と 解 釈 さ れ る 。 区 切 り か ら 次 の カ ン マ (最 後 の サ ブ オ プ シ ョ ン の 場 合 、 文 字 列 の 末 尾 ) ま で が 、 サ ブ オ プ シ ョ ン の 値 と な る 。 サ ブ オ プ シ ョ ン の 名 前 が tokens 内 の 名 前 と 一 致 し 、 値 を 表 す 文 字 列 が 見 つ か っ た 場 合 、 getsubopt () は *valuep を 値 を 表 す 文 字 列 の ア ド レ ス に 設 定 す る 。 optionp 中 の 最 初 の カ ン マ は ヌ ル バ イ ト で 上 書 き さ れ る 。 そ の た め 、 *valuep は そ の サ ブ オ プ シ ョ ン の 「 値 の 文 字 列 」 そ の も の と な る 。

サ ブ オ プ シ ョ ン が 認 識 さ れ た が 、 値 を 表 す 文 字 列 が 見 つ か ら な か っ た 場 合 、 * valuep は NULL に 設 定 さ れ る 。

getsubopt () が 返 る 時 、 optionp は 次 の サ ブ オ プ シ ョ ン を 指 し て い る 。 ち ょ う ど 最 後 の サ ブ オ プ シ ョ ン が 処 理 さ れ た 場 合 は 、 文 字 列 末 尾 の ヌ ル バ イ ト ('\0') を 指 し て い る 。

返 り 値

optionp 内 で サ ブ オ プ シ ョ ン が 見 つ か っ た 場 合 、 getsubopt () は 最 初 の サ ブ オ プ シ ョ ン に マ ッ チ す る tokens の 要 素 の 添 字 を 返 す 。 見 つ か ら な か っ た 場 合 、 -1 を 返 す 。 こ の 場 合 、 *valuep name [= value ] の 文 字 列 全 体 と な る 。

*optionp は 変 更 さ れ る の で 、 getsubopt () を 呼 び 出 す 前 の 最 初 の サ ブ オ プ シ ョ ン は getsubopt () を 呼 び 出 し 後 の サ ブ オ プ シ ョ ン と 必 ず し も 同 じ と は 限 ら な い 。

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 に つ い て は 、 attributes (7) を 参 照 。

Image grohtml-39309-1.png

準 拠

POSIX.1-2001, POSIX.1-2008.

注 意

getsubopt () は 、 文 字 列 * optionp 中 に 見 つ け た カ ン マ を 上 書 き す る の で 、 文 字 列 *optionp は 書 き 込 み 可 能 で な け れ ば な ら ず 、 文 字 列 定 数 に す る こ と は で き な い 。

以 下 の プ ロ グ ラ ム は "-o" オ プ シ ョ ン に 続 い て サ ブ オ プ シ ョ ン が あ る こ と を 期 待 し て い る 。

#define _XOPEN_SOURCE 500
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>

int
main(int argc, char **argv)
{
enum {
RO_OPT = 0,
RW_OPT,
NAME_OPT
};
char *const token[] = {
[RO_OPT] = "ro",
[RW_OPT] = "rw",
[NAME_OPT] = "name",
NULL
};
char *subopts;
char *value;
int opt;

int readonly = 0;
int readwrite = 0;
char *name = NULL;
int errfnd = 0;

while ((opt = getopt(argc, argv, "o:")) != -1) {
switch (opt) {
case 'o':
subopts = optarg;
while (*subopts != '\0' && !errfnd) {

switch (getsubopt(&subopts, token, &value)) {
case RO_OPT:
readonly = 1;
break;

case RW_OPT:
readwrite = 1;
break;

case NAME_OPT:
if (value == NULL) {
fprintf(stderr, "Missing value for "
"suboption '%s'\n", token[NAME_OPT]);
errfnd = 1;
continue;
}

name = value;
break;

default:
fprintf(stderr, "No match found "
"for token: /%s/\n", value);
errfnd = 1;
break;
}
}
if (readwrite && readonly) {
fprintf(stderr, "Only one of '%s' and '%s' can be "
"specified\n", token[RO_OPT], token[RW_OPT]);
errfnd = 1;
}
break;

default:
errfnd = 1;
}
}

if (errfnd || argc == 1) {
fprintf(stderr, "\nUsage: %s -o <suboptstring>\n", argv[0]);
fprintf(stderr, "suboptions are 'ro', 'rw', "
"and 'name=<value>'\n");
exit(EXIT_FAILURE);
}

/* Remainder of program... */

exit(EXIT_SUCCESS);
}

関 連 項 目

getopt (3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。