getopts.rb
| Path: | getopts.rb |
| Last Update: | Tue May 24 04:01:17 BST 2005 |
getopts.rb -
$Release Version: $
$Revision: 1.8.2.3 $
$Date: 2005/05/24 03:01:17 $
by Yasuo OHBA(SHL Japan Inc. Technology Dept.)
— this is obsolete; use getoptlong
2000-03-21 modified by Minero Aoki <aamine@dp.u-netsurf.ne.jp>
2002-03-05 rewritten by Akinori MUSHA <knu@ruby-lang.org>
Methods
Public Instance methods
# File getopts.rb, line 23
23: def getopts(single_options, *options)
24: boolopts = {}
25: valopts = {}
26:
27: #
28: # set defaults
29: #
30: single_options.scan(/.:?/) do |opt|
31: if opt.size == 1
32: boolopts[opt] = false
33: else
34: valopts[opt[0, 1]] = nil
35: end
36: end if single_options
37:
38: options.each do |arg|
39: opt, val = arg.split(':', 2)
40:
41: if val
42: valopts[opt] = val.empty? ? nil : val
43: else
44: boolopts[opt] = false
45: end
46: end
47:
48: #
49: # scan
50: #
51: c = 0
52: argv = ARGV
53:
54: while arg = argv.shift
55: case arg
56: when /\A--(.*)/
57: if $1.empty? # xinit -- -bpp 24
58: break
59: end
60:
61: opt, val = $1.split('=', 2)
62:
63: if opt.size == 1
64: argv.unshift arg
65: return nil
66: elsif valopts.key? opt # imclean --src +trash
67: valopts[opt] = val || argv.shift or return nil
68: elsif boolopts.key? opt # ruby --verbose
69: boolopts[opt] = true
70: else
71: argv.unshift arg
72: return nil
73: end
74:
75: c += 1
76: when /\A-(.+)/
77: opts = $1
78:
79: until opts.empty?
80: opt = opts.slice!(0, 1)
81:
82: if valopts.key? opt
83: val = opts
84:
85: if val.empty? # ruby -e 'p $:'
86: valopts[opt] = argv.shift or return nil
87: else # cc -ohello ...
88: valopts[opt] = val
89: end
90:
91: c += 1
92: break
93: elsif boolopts.key? opt
94: boolopts[opt] = true # ruby -h
95: c += 1
96: else
97: argv.unshift arg
98: return nil
99: end
100: end
101: else
102: argv.unshift arg
103: break
104: end
105: end
106:
107: #
108: # set
109: #
110: $OPT = {}
111:
112: boolopts.each do |opt, val|
113: $OPT[opt] = val
114:
115: sopt = opt.gsub(/[^A-Za-z0-9_]/, '_')
116: eval "$OPT_#{sopt} = val"
117: end
118: valopts.each do |opt, val|
119: $OPT[opt] = val
120:
121: sopt = opt.gsub(/[^A-Za-z0-9_]/, '_')
122: eval "$OPT_#{sopt} = val"
123: end
124:
125: c
126: end