diff options
Diffstat (limited to 'lib/parsearg.rb')
-rw-r--r-- | lib/parsearg.rb | 103 |
1 files changed, 59 insertions, 44 deletions
diff --git a/lib/parsearg.rb b/lib/parsearg.rb index e7e2b7a7f3..569ed260f7 100644 --- a/lib/parsearg.rb +++ b/lib/parsearg.rb @@ -1,68 +1,83 @@ +#!/usr/local/bin/ruby # -# parseargs.rb - parse arguments +# parsearg.rb - parse arguments # $Release Version: $ # $Revision: 1.3 $ -# $Date: 1994/02/15 05:16:21 $ -# by Yasuo OHBA(STAFS Development Room) +# $Date: 1996/11/12 06:48:51 $ +# by Yasuo OHBA(SHL Japan Inc. Technology Dept.) # # -- -# 引数の解析をし, $OPT_?? に値をセットします. -# 正常終了した場合は, セットされたオプションの数を返します. # -# parseArgs(argc, single_opts, *opts) -# -# ex. sample [options] filename -# options ... -# -f -x --version --geometry 100x200 -d unix:0.0 -# ↓ -# parseArgs(1, nil, "fx", "version", "geometry:", "d:") -# -# 第一引数: -# オプション以外の最低引数の数 -# 第二引数: -# オプションの必要性…必ず必要なら %TRUE そうでなければ %FALSE. -# 第三引数: -# -f や -x (= -fx) の様な一文字のオプションの指定をします. -# ここで引数がないときは nil の指定が必要です. -# 第四引数以降: -# ロングネームのオプションや, 引数の伴うオプションの指定をします. -# --version や, --geometry 300x400 や, -d host:0.0 等です. -# 引数を伴う指定は ":" を必ず付けてください. -# -# オプションの指定があった場合, 変数 $OPT_?? に non-nil もしくは, そのオ -# プションの引数がセットされます. -# -f -> $OPT_f = %TRUE -# --geometry 300x400 -> $OPT_geometry = 300x400 -# -# usage を使いたい場合は, $USAGE に usage() を指定します. -# def usage() -# … -# end -# $USAGE = 'usage' -# usage は, --help が指定された時, 間違った指定をした時に表示します. -# -# - もしくは -- は, それ以降, 全てオプションの解析をしません. +# # -$RCS_ID="$Header: /var/ohba/RCS/parseargs.rb,v 1.3 1994/02/15 05:16:21 ohba Exp ohba $" +$RCS_ID="$Header: /home/jammy/current/ruby/RCS/parsearg.rb,v 1.3 1996/11/12 06:48:51 jammy Exp $" load("getopts.rb") def printUsageAndExit() if $USAGE - apply($USAGE) + eval($USAGE) end exit() end +def setParenthesis(ex, opt, c) + if opt != "" + ex = sprintf("%s$OPT_%s%s", ex, opt, c) + else + ex = sprintf("%s%s", ex, c) + end + return ex +end + +def setOrAnd(ex, opt, c) + if opt != "" + ex = sprintf("%s$OPT_%s %s%s ", ex, opt, c, c) + else + ex = sprintf("%s %s%s ", ex, c, c) + end + return ex +end + +def setExpression(ex, opt, op) + if !op + ex = sprintf("%s$OPT_%s", ex, opt) + return ex + end + case op.chr + when "(", ")" + ex = setParenthesis(ex, opt, op.chr) + when "|", "&" + ex = setOrAnd(ex, opt, op.chr) + else + return nil + end + return ex +end + def parseArgs(argc, nopt, single_opts, *opts) - if ((noOptions = getopts(single_opts, *opts)) == nil) + if (noOptions = getopts(single_opts, *opts)) == nil printUsageAndExit() end - if (nopt && noOptions == 0) - printUsageAndExit() + if nopt + ex = nil + pos = 0 + for o in nopt.split(/[()|&]/) + pos += o.length + ex = setExpression(ex, o, nopt[pos]) + pos += 1 + end + begin + if !eval(ex) + printUsageAndExit() + end + rescue + print "Format Error!! : \"" + nopt + "\"\t[parseArgs]\n" + exit! -1 + end end - if ($ARGV.length < argc) + if ARGV.length < argc printUsageAndExit() end return noOptions |