Manpages

名 前

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

書 式

#include <stdlib.h>

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

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

getsubopt():

_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* Since 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 を 返 す 。 こ の 場 合 、 *valuepname[=value] の 文 字 列 全 体 と な る 。

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

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 getsubopt() は ス レ ッ ド セ ー フ で あ る 。

準 拠

POSIX.1−2001.

注 意

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 プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。