diff options
Diffstat (limited to 'lib/getopts.rb')
-rw-r--r-- | lib/getopts.rb | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/lib/getopts.rb b/lib/getopts.rb new file mode 100644 index 0000000000..37fd3dc69d --- /dev/null +++ b/lib/getopts.rb @@ -0,0 +1,117 @@ +# +# getopts.rb - get options +# $Release Version: $ +# $Revision: 1.2 $ +# $Date: 1994/02/15 05:17:15 $ +# by Yasuo OHBA(STAFS Development Room) +# +# -- +# オプションの解析をし, $OPT_?? に値をセットします. +# 指定のないオプションが指定された時は nil を返します. +# 正常終了した場合は, セットされたオプションの数を返します. +# +# getopts(single_opts, *opts) +# +# ex. sample [options] filename +# options ... +# -f -x --version --geometry 100x200 -d unix:0.0 +# ↓ +# getopts("fx", "version", "geometry:", "d:") +# +# 第一引数: +# -f や -x (= -fx) の様な一文字のオプションの指定をします. +# ここで引数がないときは nil の指定が必要です. +# 第二引数以降: +# ロングネームのオプションや, 引数の伴うオプションの指定をします. +# --version や, --geometry 300x400 や, -d host:0.0 等です. +# 引数を伴う指定は ":" を必ず付けてください. +# +# オプションの指定があった場合, 変数 $OPT_?? に non-nil もしくは, そのオ +# プションの引数がセットされます. +# -f -> $OPT_f = TRUE +# --geometry 300x400 -> $OPT_geometry = 300x400 +# +# - もしくは -- は, それ以降, 全てオプションの解析をしません. +# + +$RCS_ID="$Header: /var/ohba/RCS/getopts.rb,v 1.2 1994/02/15 05:17:15 ohba Exp ohba $" + +def getopts(single_opts, *opts) + if (opts) + single_colon = "" + long_opts = [] + sc = 0 + for option in opts + if (option.length <= 2) + single_colon[sc, 0] = option[0, 1] + sc += 1 + else + long_opts.push(option) + end + end + end + + opts = {} + count = 0 + while ($ARGV.length != 0) + compare = nil + case $ARGV[0] + when /^--?$/ + $ARGV.shift + break + when /^--.*/ + compare = $ARGV[0][2, ($ARGV[0].length - 2)] + if (long_opts != "") + for option in long_opts + if (option[(option.length - 1), 1] == ":" && + option[0, (option.length - 1)] == compare) + if ($ARGV.length <= 1) + return nil + end + eval("$OPT_" + compare + " = " + '$ARGV[1]') + opts[compare] = TRUE + $ARGV.shift + count += 1 + break + elsif (option == compare) + eval("$OPT_" + compare + " = TRUE") + opts[compare] = TRUE + count += 1 + break + end + end + end + when /^-.*/ + for index in 1..($ARGV[0].length - 1) + compare = $ARGV[0][index, 1] + if (single_opts && compare =~ "[" + single_opts + "]") + eval("$OPT_" + compare + " = TRUE") + opts[compare] = TRUE + count += 1 + elsif (single_colon != "" && compare =~ "[" + single_colon + "]") + if ($ARGV[0][index..-1].length > 1) + eval("$OPT_" + compare + " = " + '$ARGV[0][(index + 1)..-1]') + opts[compare] = TRUE + count += 1 + elsif ($ARGV.length <= 1) + return nil + else + eval("$OPT_" + compare + " = " + '$ARGV[1]') + opts[compare] = TRUE + $ARGV.shift + count = count + 1 + end + break + end + end + else + break + end + + $ARGV.shift + if (!opts.includes(compare)) + return nil + end + end + return count +end |