[#9445] thread.rb — m_seki@...

18 messages 2000/03/16
[#9446] Re: thread.rb — matz@... (Yukihiro Matsumoto) 2000/03/17

[#9460] Re: thread.rb — m_seki@... 2000/03/21

[#9462] Re: thread.rb — matz@... (Yukihiro Matsumoto) 2000/03/21

まつもと ゆきひろです

[#11281] Re: thread.rb — Masatoshi SEKI <m_seki@...> 2000/10/22

[#9498] timeout しない timeout — ARIMA Yasuhiro <fit0298@...>

有馬です。

20 messages 2000/03/26
[#9506] Re: timeout しない timeout — matz@... (Yukihiro Matsumoto) 2000/03/27

まつもと ゆきひろです

[#9509] Re: timeout しない timeout — gotoken@... (GOTO Kentaro) 2000/03/27

In message "[ruby-dev:9506] Re: timeout しない timeout"

[ruby-dev:9465] getopts

From: Minero Aoki <aamine@...>
Date: 2000-03-22 04:29:32 UTC
List: ruby-dev #9465
あおきです。

getopts ですが、実際の引数以外は実際にセットしてくれないので、
-d をつけると無駄な warning (uninitialized global variable) が
いっぱいでてしまいます。それがどーにも気にくわないので直してみました。
変更したところは、

  *  すべてのオプションに対し変数をセット
  *  メソッドは getopts ひとつだけ
  *  タブをスペースに変換

です。できればとりこんでもらえないでしょうか。

いちおう動作チェックはひととおりしてありますが、
元の getopts よりは動作実績がないのでなんとも言えません。
-------------------------------------------------------------------
あおきみねろう

#
#		getopts.rb - 
#                        $Release Version: $
#                        $Revision: 1.2 $
#                        $Date: 1999/08/13 05:45:16 $
#                        by Yasuo OHBA(SHL Japan Inc. Technology Dept.)
#
# --
#
# 2000-03-21
# modified by Minero Aoki <aamine@dp.u-netsurf.ne.jp>
#

$RCS_ID=%q$Header: /home/cvs/ruby/lib/getopts.rb,v 1.2 1999/08/13 05:45:16 matz Exp $


def getopts( single_opts, *options )
  single_opts_exp = (single_opts && !single_opts.empty?) ?
                        /[#{single_opts}]/ : nil
  single_colon_exp = nil
  single_colon = nil
  opt = arg = val = nil
  boolopts = {}
  valopts = {}
  argv = ARGV
  newargv = []

  #
  # set default
  #
  if single_opts then
    single_opts.each_byte do |byte|
      boolopts[ byte.chr ] = false
    end
  end
  unless options.empty? then
    single_colon = ''

    options.each do |opt|
      m = /\A([^:]+):(.*)\z/.match( opt )
      if m then
        valopts[ m[1] ] = m[2].empty? ? 0 : m[2]
      else
        boolopts[ opt ] = false
      end
    end
    valopts.each do |opt, dflt|
      if opt.size == 1 then
        single_colon << opt
      end
    end

    if single_colon.empty? then
      single_colon = single_colon_exp = nil
    else
      single_colon_exp = /[#{single_colon}]/
    end
  end
  
  #
  # scan
  #
  c = 0
  arg = argv.shift
  while arg do
    case arg
    when /\A--?\z/                      # xinit -- -bpp 24
      newargv.concat argv
      break

    when /\A--(.*)/
      opt = $1
      if valopts.key? opt  then         # imclean --src +trash
        return nil if argv.empty?
        valopts[ opt ] = argv.shift
      elsif boolopts.key? opt then      # ruby --verbose
        boolopts[ opt ] = true
      else
        return nil
      end
      c += 1

    when /\A-(.+)/
      arg = $1
      0.upto( arg.size - 1 ) do |idx|
        opt = arg[idx, 1]
        if single_opts and single_opts_exp === opt then
          boolopts[ opt ] = true        # ruby -h
          c += 1

        elsif single_colon and single_colon_exp === opt then
          val = arg[ (idx+1)..-1 ]
          if val.empty? then            # ruby -e 'p $:'
            return nil if argv.empty?
            valopts[ opt ] = argv.shift
          else                          # cc -ohello ...
            valopts[ opt ] = val
          end
          c += 1

          break
        else
          return nil
        end
      end

    else                                # ruby test.rb
      newargv.push arg
    end

    arg = argv.shift
  end

  #
  # set
  #
  boolopts.each do |opt, val|
    eval "$OPT_#{opt} = val"
  end
  valopts.each do |opt, val|
    eval "$OPT_#{opt} = #{val == 0 ? 'nil' : 'val'}"
  end
  argv.replace newargv

  c
end

In This Thread

Prev Next