Yash 2 その 206: 自前 getopt 関数の作り直し
組込みコマンドに与えた引数に含まれるオプションを解析するのに、これまでは getopt_long 関数に似せた自前の関数を使っていたが、自前の関数を使うのであればわざわざ getopt_long に似せる必要はないということで、引数の形式などを変更することにした。
よく知られている getopt_long 関数の原型 (プロトタイプ) は以下のようになっている:
int getopt_long(int argc, char *const argv[],
const char *shortopts,
const struct option *longopts, int *indexptr);
第三引数 (shortopts) が短いオプションをどう解析するかを、第四引数 (longopts) が長いオプションをどう解析するかを指示している。なぜ別別の引数になっているのかというと、もともと getopt_long 関数は短いオプションしか解析できない getopt 関数を拡張したものだからである (getopt_long 関数の最初の三つの引数は getopt 関数の引数と一致する)。しかしこのような設計では同じ意味を持つ短いオプションと長いオプションの指示が別の引数に分かれてしまい、結果として指示が読みづらくなる。
そこで、yash の新しい自前の解析関数 (xgetopt) では、getopt_long 関数の option 構造体に対応する xgetopt 構造体の中で短いオプションも長いオプションも指示するようにする。同じ意味を持つ短いオプションと長いオプションを一つの構造体で指示できるので、オプションの指示が解りやすくなる。
| 固定リンク
コメント