SCAN_OPTION 3.02
Copyright (C) 1996,1997,1999 Taiji Yamada <taiji@aihara.co.jp>
[戻る] [English Page]
名前
scan_option - オプション解析ルーチン
形式
#include <option.h>
int scan_option(int argc, char *argv[], char *key, ...);
argc - コマンドライン引数の数
argv - コマンドライン引数
key, ... - キーを表す文字列と可変引数
説明
-
コマンドラインオプション中に指定されたキーが存在する場合、真を返します。例えば、コマンドラインで
"-help"
が指定されていた場合、
scan_option(argc, argv, "-help")
は真を返します。
コマンドラインオプション中に指定されたキーが存在し、そのキーが scanf 書式を持つ場合、キーの後に指定された可変引数にコマンドライン中の値をセットし、真を返します。例えば、コマンドライン中に
"-geom
100x100" が指定された場合、
scan_option(argc, argv, "-geom %dx%d", &width, &height)
は真を返し、width, height にはそれぞれ整数値 100, 100
が代入されます。
コマンドラインオプション中に指定されたキーが存在し、そのキーが scanf 書式の
"%s"
が指定されていた場合、キーの後に指定された可変引数にコマンドライン中のマッチした引数の次の文字列をセットします。例えば、コマンドライン中に
'-title
"A string"' が指定された場合、この "A string" は引数の単一の要素なので、
scan_option(argc, argv, "-title %s", title)
は文字列変数 title に "A string" をセットし真を返します。
コマンドラインオプション中に指定されたキーが存在し、そのキーが scanf 書式の
"\"%s\""
が指定されていた場合、キーの後に指定された可変引数にコマンドライン中のマッチした引数の次の文字列をセットします。例えば、コマンドライン中に
'-title
\"A string\"' が指定された場合、この "A string" が引数の単一の要素でなくても、ダブルクオートで括られていることから、
scan_option(argc, argv, "-title \"%s\"", title)
は文字列変数 title に "A string" をセットし真を返します。ダブルクオートで括られていない場合の動作は
"-title
%s" と同じ動作になります。
キーが "-on[-]" のような形式の場合、そのキーはフラグであるとみなし、可変引数に
int
型のポインタを期待します。例えば、コマンドラインに "-on" が指定された場合、
scan_option(argc, argv, "-on[-]", &flag)
は int 型のポインタ flag に真を代入します。"-on-"
が指定された場合には flag には偽が代入され、いずれの場合にも真を返します。
また、キーが "[-+]mode" もしくは "[+-]mode" のような形式の場合、そのキーもフラグであるとみなし、可変引数に
int
型のポインタを期待します。例えば、コマンドラインに "-mode" が指定された場合、
scan_option(argc, argv, "[-+]mode", &flag)
は int 型のポインタ flag に真を代入します。"+mode"
が指定された場合には flag には偽が代入され、いずれの場合にも真を返します。
一方、
scan_option(argc, argv, "[+-]mode", &flag)
は、コマンドラインに "-mode" が指定された場合には、int
型のポインタ flag に偽を代入し、"+mode" が指定された場合には
flag
には真が代入され、いずれの場合にも真を返します。
またキーが "-color Red Green Blue" のように、scanf 形式でもなく、中途に空白を含む場合、それは列挙型を期待するキーであるとみなし、可変引数に
int
型のポインタを期待します。例えば、コマンドラインに "-color Blue"
が指定された場合、
scan_option(argc, argv, "-color Red Green Blue", &color)
は int 型の変数 color に 2 を代入し、真を返します。
またキーが "-plot None|Line|Dot|Point" のように、scanf 形式でもなく、中途に"|"を含む場合、それはビットマスク型を期待するキーであるとみなし、可変引数に
unsigned
long 型のポインタを期待します。例えば、コマンドラインに "-plot
Line|Point" が指定された場合、
scan_option(argc, argv, "-plot None|Line|Dot|Point", &plot)
は unsigned long 型の変数 plot に (1L<<0|1L<<2)
を代入し、真を返します。
また、キーが "-v %lf,.." のように、一つの型指定子と ",..."
からなる場合、これは任意長のベクトルを期待するキーであるとみなし、可変引数に指定された型の配列のポインタを期待します。例えば、コマンドラインに
"-v
0.1,1,10" が指定された場合、
scan_option(argc, argv, "-v %lf,..", &v, &nl,&nh)
は v=NULL, nl=0 の場合、範囲 [0..2(=nh)] の double
型の配列を確保し、コマンドライン引数に従って値を代入し、そのアドレスを
v
に代入し、真を返します。ちなみにこのように v に予め NULL
を代入しておくと、コマンドライン引数に従ったサイズのメモリを確保し、long
int 型の nh にその上限を代入しますが、v に NULL
以外のアドレスを入れておいた場合、メモリは確保せず指定した
[nl..nh]
の範囲に代入が制限されます。
さらに、キーが "-m (%lf,..),.." のように、一つの型指定子と "(",
",...","),.." からなる場合、これは任意サイズの行列を期待するキーであるとみなし、可変引数に指定された型の2次元配列のポインタを期待します。例えば、コマンドラインに
"-m
(0.1,1,10),(0.2,2,20),(0.3,3,30)" が指定された場合、
scan_option(argc, argv, "-m (%lf,..),..", &m, &nrl,&nrh, &ncl,&nch)
は m=NULL, nrl=0, ncl=0 の場合、範囲 [0..2(=nrh)][0..2(=nch)]
の double 型の2次元配列を確保し、コマンドライン引数に従って値を代入し、そのアドレスを
m
に代入し、真を返します。ちなみにこのように m に予め NULL
を代入しておくと、コマンドライン引数に従ったサイズのメモリを確保し、long
int 型の nrh, nch にその上限を代入しますが、m に
NULL
以外のアドレスを入れておいた場合、メモリは確保せず指定した
[nrl..nrh][ncl..nch]
の範囲に代入が制限されます。
これらのベクトル、行列の要素には以下の型が指定できます。
-
int … 変換指定子 "%d", "%i"
-
short int … 変換指定子 "%hd", "%hi"
-
long int … 変換指定子 "%ld", "%li"
-
unsigned int … 変換指定子 "%o", "%u", "%x"
-
unsigned short … 変換指定子 "%ho", "%hu", "%hx"
-
unsigned long … 変換指定子 "%lo", "%lu", "%lx"
-
float … 変換指定子 "%e", "%f", "%g"
-
double … 変換指定子 "%le", "%lf", "%lg"
-
long double … 変換指定子 "%Le", "%Lf", "%Lg"
変換指定子については sscanf(3s) を参照して下さい。
また、上記すべての scan_option が返す真とは、正確には、キーがマッチしたコマンドライン引数の番号であり、例えば、以下のような使い方が可能です。
if ((c=scan_option(argc, argv, "-f")) {
c++; n = 0;
while (c<argc)
strcpy(files[n++], argv[c++]);
}
作者