diff options
Diffstat (limited to 'lib/getopts.rb')
-rw-r--r-- | lib/getopts.rb | 173 |
1 files changed, 99 insertions, 74 deletions
diff --git a/lib/getopts.rb b/lib/getopts.rb index 37fd3dc69d..d25437515d 100644 --- a/lib/getopts.rb +++ b/lib/getopts.rb @@ -1,117 +1,142 @@ +#!/usr/local/bin/ruby # -# getopts.rb - get options +# getopts.rb - # $Release Version: $ -# $Revision: 1.2 $ -# $Date: 1994/02/15 05:17:15 $ -# by Yasuo OHBA(STAFS Development Room) +# $Revision: 1.1 $ +# $Date: 1996/11/10 05:01:15 $ +# by Yasuo OHBA(SHL Japan Inc. Technology Dept.) # # -- -# オプションの解析をし, $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 $" +$RCS_ID="$Header: /home/jammy/current/ruby/RCS/getopts.rb,v 1.1 1996/11/10 05:01:15 jammy Exp $" + +def isSingle(lopt) + if lopt.index(":") + if lopt.split(":")[0].length == 1 + return TRUE + end + end + return nil +end + +def getOptionName(lopt) + return lopt.split(":")[0] +end + +def getDefaultOption(lopt) + od = lopt.split(":")[1] + if od + return od + end + return nil +end + +def setOption(name, value) + eval("$OPT_" + name + " = " + 'value') +end + +def setDefaultOption(lopt) + d = getDefaultOption(lopt) + if d + setOption(getOptionName(lopt), d) + end +end + +def setNewArgv(newargv) + ARGV.clear + for na in newargv + ARGV << na + end +end -def getopts(single_opts, *opts) - if (opts) + +def getopts(single_opts, *options) + if options single_colon = "" long_opts = [] sc = 0 - for option in opts - if (option.length <= 2) - single_colon[sc, 0] = option[0, 1] + for o in options + setDefaultOption(o) + if isSingle(o) + single_colon[sc, 0] = getOptionName(o) sc += 1 else - long_opts.push(option) + long_opts.push(o) end end end - + opts = {} count = 0 - while ($ARGV.length != 0) + newargv = [] + while ARGV.length != 0 compare = nil - case $ARGV[0] + case ARGV[0] when /^--?$/ - $ARGV.shift + ARGV.shift + newargv += ARGV 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) + compare = ARGV[0][2, (ARGV[0].length - 2)] + if long_opts != "" + for lo in long_opts + if lo.index(":") && getOptionName(lo) == compare + if ARGV.length <= 1 return nil - end - eval("$OPT_" + compare + " = " + '$ARGV[1]') - opts[compare] = TRUE - $ARGV.shift + end + setOption(compare, ARGV[1]) + opts[compare] = TRUE + ARGV.shift count += 1 break - elsif (option == compare) - eval("$OPT_" + compare + " = TRUE") - opts[compare] = TRUE + elsif lo == compare + setOption(compare, TRUE) + opts[compare] = TRUE count += 1 - break - end - end + break + end + end + end + if compare.length <= 1 + return nil 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 + for idx in 1..(ARGV[0].length - 1) + compare = ARGV[0][idx, 1] + if single_opts && compare =~ "[" + single_opts + "]" + setOption(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 + elsif single_colon != "" && compare =~ "[" + single_colon + "]" + if ARGV[0][idx..-1].length > 1 + setOption(compare, ARGV[0][(idx + 1)..-1]) + opts[compare] = TRUE count += 1 - elsif ($ARGV.length <= 1) + elsif ARGV.length <= 1 return nil else - eval("$OPT_" + compare + " = " + '$ARGV[1]') - opts[compare] = TRUE - $ARGV.shift - count = count + 1 + setOption(compare, ARGV[1]) + opts[compare] = TRUE + ARGV.shift + count += 1 end break end end else - break + compare = ARGV[0] + opts[compare] = TRUE + newargv << ARGV[0] end - - $ARGV.shift - if (!opts.includes(compare)) + + ARGV.shift + if !opts.has_key?(compare) return nil end end + setNewArgv(newargv) return count end |