@@ -65,7 +65,7 @@ fn optmulti(str name) -> opt {
65
65
66
66
tag optval { val( str) ; given; }
67
67
68
- type match = rec ( vec [ opt] opts , vec [ mutable vec [ optval] ] vals , vec[ str] free ) ;
68
+ type match = rec( opt[ ] opts, ( optval[ ] ) [ mutable ] vals, vec[ str] free) ;
69
69
70
70
fn is_arg( str arg) -> bool {
71
71
ret str:: byte_len( arg) > 1 u && arg. ( 0 ) == '-' as u8;
@@ -78,9 +78,9 @@ fn name_str(name nm) -> str {
78
78
} ;
79
79
}
80
80
81
- fn find_opt ( vec [ opt] opts , name nm) -> option:: t [ uint ] {
81
+ fn find_opt( & opt[ ] opts, name nm) -> option:: t[ uint] {
82
82
auto i = 0 u;
83
- auto l = vec :: len[ opt] ( opts) ;
83
+ auto l = ivec :: len[ opt] ( opts) ;
84
84
while ( i < l) {
85
85
if ( opts. ( i) . name == nm) { ret some[ uint] ( i) ; }
86
86
i += 1 u;
@@ -119,19 +119,31 @@ fn fail_str(fail_ f) -> str {
119
119
tag result { success( match ) ; failure ( fail_) ; }
120
120
121
121
fn getopts ( vec[ str] args, vec[ opt] opts) -> result {
122
- auto n_opts = vec:: len[ opt] ( opts) ;
123
- fn f ( uint x) -> vec[ optval ] { ret vec:: empty ( ) ; }
124
- auto vals = vec:: init_fn_mut[ vec[ optval] ] ( f, n_opts) ;
122
+ // FIXME: Remove this vec->ivec conversion.
123
+ auto args_ivec = ~[ ] ; auto opts_ivec = ~[ ] ;
124
+ for ( str arg in args) { args_ivec += ~[ arg] ; }
125
+ for ( opt o in opts) { opts_ivec += ~[ o] ; }
126
+ ret getopts_ivec ( args_ivec, opts_ivec) ;
127
+ }
128
+
129
+ fn getopts_ivec( & str[ ] args, & opt[ ] opts) -> result {
130
+ auto n_opts = ivec:: len[ opt] ( opts) ;
131
+ fn f ( uint x) -> optval[ ] { ret ~[ ] ; }
132
+ auto vals = ivec:: init_fn_mut[ optval[ ] ] ( f, n_opts) ;
125
133
let vec[ str] free = [ ] ;
126
- auto l = vec :: len[ str] ( args) ;
134
+ auto l = ivec :: len[ str] ( args) ;
127
135
auto i = 0 u;
128
136
while ( i < l) {
129
137
auto cur = args. ( i) ;
130
138
auto curlen = str:: byte_len ( cur) ;
131
139
if ( !is_arg ( cur) ) {
132
- vec :: push [ str ] ( free, cur) ;
140
+ free += [ cur] ;
133
141
} else if ( str:: eq ( cur, "--" ) ) {
134
- free += vec:: slice[ str] ( args, i + 1 u, l) ;
142
+ auto j = i + 1 u;
143
+ while ( j < l) {
144
+ free += [ args. ( j) ] ;
145
+ j += 1 u;
146
+ }
135
147
break ;
136
148
} else {
137
149
auto names;
@@ -140,19 +152,19 @@ fn getopts(vec[str] args, vec[opt] opts) -> result {
140
152
auto tail = str:: slice ( cur, 2 u, curlen) ;
141
153
auto eq = str:: index ( tail, '=' as u8 ) ;
142
154
if ( eq == -1 ) {
143
- names = [ long ( tail) ] ;
155
+ names = ~ [ long ( tail) ] ;
144
156
} else {
145
- names = [ long ( str:: slice ( tail, 0 u, eq as uint ) ) ] ;
157
+ names = ~ [ long ( str:: slice ( tail, 0 u, eq as uint ) ) ] ;
146
158
i_arg =
147
159
option:: some[ str] ( str:: slice ( tail, ( eq as uint ) + 1 u,
148
160
curlen - 2 u) ) ;
149
161
}
150
162
} else {
151
163
auto j = 1 u;
152
- names = [ ] ;
164
+ names = ~ [ ] ;
153
165
while ( j < curlen) {
154
166
auto range = str:: char_range_at ( cur, j) ;
155
- vec :: push [ name ] ( names, short ( range. _0 ) ) ;
167
+ names += ~ [ short ( range. _0 ) ] ;
156
168
j = range. _1 ;
157
169
}
158
170
}
@@ -171,29 +183,27 @@ fn getopts(vec[str] args, vec[opt] opts) -> result {
171
183
if ( !option:: is_none[ str] ( i_arg) ) {
172
184
ret failure ( unexpected_argument ( name_str ( nm) ) ) ;
173
185
}
174
- vec :: push [ optval ] ( vals. ( optid) , given) ;
186
+ vals. ( optid) += ~ [ given] ;
175
187
}
176
188
case ( maybe) {
177
189
if ( !option:: is_none[ str] ( i_arg) ) {
178
- vec:: push[ optval] ( vals. ( optid) ,
179
- val ( option:: get[ str] ( i_arg) ) ) ;
180
- } else if ( name_pos < vec:: len[ name] ( names) ||
190
+ vals. ( optid) += ~[ val ( option:: get ( i_arg) ) ] ;
191
+ } else if ( name_pos < ivec:: len[ name] ( names) ||
181
192
i + 1 u == l || is_arg ( args. ( i + 1 u) ) ) {
182
- vec :: push [ optval ] ( vals. ( optid) , given) ;
193
+ vals. ( optid) += ~ [ given] ;
183
194
} else {
184
195
i += 1 u;
185
- vec :: push [ optval ] ( vals. ( optid) , val ( args. ( i) ) ) ;
196
+ vals. ( optid) += ~ [ val ( args. ( i) ) ] ;
186
197
}
187
198
}
188
199
case ( yes) {
189
200
if ( !option:: is_none[ str] ( i_arg) ) {
190
- vec:: push[ optval] ( vals. ( optid) ,
191
- val ( option:: get[ str] ( i_arg) ) ) ;
201
+ vals. ( optid) += ~[ val ( option:: get[ str] ( i_arg) ) ] ;
192
202
} else if ( i + 1 u == l) {
193
203
ret failure ( argument_missing ( name_str ( nm) ) ) ;
194
204
} else {
195
205
i += 1 u;
196
- vec :: push [ optval ] ( vals. ( optid) , val ( args. ( i) ) ) ;
206
+ vals. ( optid) += ~ [ val ( args. ( i) ) ] ;
197
207
}
198
208
}
199
209
}
@@ -203,7 +213,7 @@ fn getopts(vec[str] args, vec[opt] opts) -> result {
203
213
}
204
214
i = 0 u;
205
215
while ( i < n_opts) {
206
- auto n = vec :: len[ optval] ( vals. ( i) ) ;
216
+ auto n = ivec :: len[ optval] ( vals. ( i) ) ;
207
217
auto occ = opts. ( i) . occur ;
208
218
if ( occ == req) {
209
219
if ( n == 0 u) {
@@ -220,7 +230,7 @@ fn getopts(vec[str] args, vec[opt] opts) -> result {
220
230
ret success( rec ( opts=opts, vals=vals, free=free) ) ;
221
231
}
222
232
223
- fn opt_vals ( match m, str nm) -> vec [ optval ] {
233
+ fn opt_vals( match m, str nm) -> optval[ ] {
224
234
ret alt ( find_opt ( m. opts , mkname ( nm) ) ) {
225
235
case ( some ( ?id) ) { m. vals . ( id) }
226
236
case ( none) { log_err "No option '" + nm + "' defined." ; fail }
@@ -230,7 +240,7 @@ fn opt_vals(match m, str nm) -> vec[optval] {
230
240
fn opt_val ( match m, str nm) -> optval { ret opt_vals( m, nm) . ( 0 ) ; }
231
241
232
242
fn opt_present( match m, str nm) -> bool {
233
- ret vec :: len[ optval] ( opt_vals ( m, nm) ) > 0 u;
243
+ ret ivec :: len[ optval] ( opt_vals( m, nm) ) > 0 u;
234
244
}
235
245
236
246
fn opt_str( match m, str nm) -> str {
@@ -240,14 +250,22 @@ fn opt_str(match m, str nm) -> str {
240
250
fn opt_strs( match m, str nm) -> vec[ str] {
241
251
let vec[ str] acc = [ ] ;
242
252
for ( optval v in opt_vals( m, nm) ) {
243
- alt ( v) { case ( val( ?s) ) { vec:: push[ str] ( acc, s) ; } case ( _) { } }
253
+ alt ( v) { case ( val( ?s) ) { acc += [ s] ; } case ( _) { } }
254
+ }
255
+ ret acc;
256
+ }
257
+
258
+ fn opt_strs_ivec( match m, str nm) -> str[ ] {
259
+ let str [ ] acc = ~[ ] ;
260
+ for ( optval v in opt_vals( m, nm) ) {
261
+ alt ( v) { case ( val( ?s) ) { acc += ~[ s] ; } case ( _) { } }
244
262
}
245
263
ret acc;
246
264
}
247
265
248
266
fn opt_maybe_str( match m, str nm) -> option:: t[ str] {
249
267
auto vals = opt_vals( m, nm) ;
250
- if ( vec :: len[ optval] ( vals) == 0 u) { ret none[ str] ; }
268
+ if ( ivec :: len[ optval] ( vals) == 0 u) { ret none[ str] ; }
251
269
ret alt ( vals. ( 0 ) ) {
252
270
case ( val( ?s) ) { some[ str] ( s) }
253
271
case ( _) { none[ str] }
@@ -260,7 +278,7 @@ fn opt_maybe_str(match m, str nm) -> option::t[str] {
260
278
/// present and an argument was provided.
261
279
fn opt_default( match m, str nm, str def) -> option:: t[ str] {
262
280
auto vals = opt_vals( m, nm) ;
263
- if ( vec :: len[ optval] ( vals) == 0 u) { ret none[ str] ; }
281
+ if ( ivec :: len[ optval] ( vals) == 0 u) { ret none[ str] ; }
264
282
ret alt ( vals. ( 0 ) ) {
265
283
case ( val( ?s) ) { some[ str] ( s) }
266
284
case ( _) { some[ str] ( def) }
0 commit comments