21
21
* Single-character options are expected to appear on the command line with a
22
22
* single preceding dash; multiple-character options are expected to be
23
23
* proceeded by two dashes. Options that expect an argument accept their
24
- * argument following either a space or an equals sign.
24
+ * argument following either a space or an equals sign. Single-character
25
+ * options don't require the space.
25
26
*
26
27
* # Example
27
28
*
@@ -203,7 +204,7 @@ impl Matches : Eq {
203
204
}
204
205
205
206
fn is_arg ( arg : & str ) -> bool {
206
- return arg. len ( ) > 1 u && arg[ 0 ] == '-' as u8 ;
207
+ return arg. len ( ) > 1 && arg[ 0 ] == '-' as u8 ;
207
208
}
208
209
209
210
fn name_str ( nm : & Name ) -> ~str {
@@ -293,38 +294,37 @@ pub type Result = result::Result<Matches, Fail_>;
293
294
* Use <fail_str> to get an error message.
294
295
*/
295
296
pub fn getopts( args : & [ ~str ] , opts : & [ Opt ] ) -> Result unsafe {
296
- let n_opts = vec :: len :: < Opt > ( opts ) ;
297
+ let n_opts = opts . len ( ) ;
297
298
fn f ( _x : uint ) -> ~[ Optval ] { return ~[ ] ; }
298
299
let vals = vec:: to_mut ( vec:: from_fn ( n_opts, f) ) ;
299
300
let mut free: ~[ ~str ] = ~[ ] ;
300
- let l = vec :: len ( args ) ;
301
- let mut i = 0 u ;
301
+ let l = args . len ( ) ;
302
+ let mut i = 0 ;
302
303
while i < l {
303
304
let cur = args[ i] ;
304
305
let curlen = cur. len ( ) ;
305
306
if !is_arg ( cur) {
306
307
free. push ( cur) ;
307
308
} else if cur == ~"--" {
308
- let mut j = i + 1u ;
309
- while j < l { free.push(args[j]); j += 1u ; }
309
+ let mut j = i + 1 ;
310
+ while j < l { free.push(args[j]); j += 1 ; }
310
311
break;
311
312
} else {
312
313
let mut names;
313
- let mut i_arg = option:: None::<~str> ;
314
+ let mut i_arg = None;
314
315
if cur[1] == '-' as u8 {
315
- let tail = str::slice(cur, 2u , curlen);
316
- let tail_eq = str::splitn_char(tail, '=', 1u );
317
- if vec:: len(tail_eq ) <= 1u {
316
+ let tail = str::slice(cur, 2 , curlen);
317
+ let tail_eq = str::splitn_char(tail, '=', 1 );
318
+ if tail_eq. len() <= 1 {
318
319
names = ~[Long(tail)];
319
320
} else {
320
321
names =
321
322
~[Long(tail_eq[0])];
322
- i_arg =
323
- option::Some::<~str>(tail_eq[1]);
323
+ i_arg = Some(tail_eq[1]);
324
324
}
325
325
} else {
326
- let mut j = 1u ;
327
- let mut last_valid_opt_id = option:: None;
326
+ let mut j = 1 ;
327
+ let mut last_valid_opt_id = None;
328
328
names = ~[];
329
329
while j < curlen {
330
330
let range = str::char_range_at(cur, j);
@@ -338,7 +338,7 @@ pub fn getopts(args: &[~str], opts: &[Opt]) -> Result unsafe {
338
338
*/
339
339
340
340
match find_opt(opts, opt) {
341
- Some(id) => last_valid_opt_id = option:: Some(id),
341
+ Some(id) => last_valid_opt_id = Some(id),
342
342
None => {
343
343
let arg_follows =
344
344
last_valid_opt_id.is_some() &&
@@ -348,21 +348,21 @@ pub fn getopts(args: &[~str], opts: &[Opt]) -> Result unsafe {
348
348
Yes | Maybe => true,
349
349
No => false
350
350
};
351
- if arg_follows && j + 1 < curlen {
352
- i_arg = option:: Some(str:: slice(cur, j, curlen));
351
+ if arg_follows && j < curlen {
352
+ i_arg = Some(cur. slice(j, curlen));
353
353
break;
354
354
} else {
355
- last_valid_opt_id = option:: None;
355
+ last_valid_opt_id = None;
356
356
}
357
357
}
358
358
}
359
359
names.push(opt);
360
360
j = range.next;
361
361
}
362
362
}
363
- let mut name_pos = 0u ;
364
- for vec:: each(names ) |nm| {
365
- name_pos += 1u ;
363
+ let mut name_pos = 0 ;
364
+ for names. each() |nm| {
365
+ name_pos += 1 ;
366
366
let optid = match find_opt(opts, *nm) {
367
367
Some(id) => id,
368
368
None => return Err(UnrecognizedOption(name_str(nm)))
@@ -377,38 +377,38 @@ pub fn getopts(args: &[~str], opts: &[Opt]) -> Result unsafe {
377
377
Maybe => {
378
378
if !i_arg.is_none() {
379
379
vals[optid].push(Val(i_arg.get()));
380
- } else if name_pos < vec:: len::<Name>(names ) ||
381
- i + 1u == l || is_arg(args[i + 1u ]) {
380
+ } else if name_pos < names. len( ) ||
381
+ i + 1 == l || is_arg(args[i + 1 ]) {
382
382
vals[optid].push(Given);
383
- } else { i += 1u ; vals[optid].push(Val(args[i])); }
383
+ } else { i += 1 ; vals[optid].push(Val(args[i])); }
384
384
}
385
385
Yes => {
386
386
if !i_arg.is_none() {
387
387
vals[optid].push(Val(i_arg.get()));
388
- } else if i + 1u == l {
388
+ } else if i + 1 == l {
389
389
return Err(ArgumentMissing(name_str(nm)));
390
- } else { i += 1u ; vals[optid].push(Val(args[i])); }
390
+ } else { i += 1 ; vals[optid].push(Val(args[i])); }
391
391
}
392
392
}
393
393
}
394
394
}
395
- i += 1u ;
395
+ i += 1 ;
396
396
}
397
397
i = 0u;
398
398
while i < n_opts {
399
- let n = vec::len::<Optval>( vals[i]);
399
+ let n = vals[i].len( );
400
400
let occ = opts[i].occur;
401
401
if occ == Req {
402
- if n == 0u {
402
+ if n == 0 {
403
403
return Err(OptionMissing(name_str(&(opts[i].name))));
404
404
}
405
405
}
406
406
if occ != Multi {
407
- if n > 1u {
407
+ if n > 1 {
408
408
return Err(OptionDuplicated(name_str(&(opts[i].name))));
409
409
}
410
410
}
411
- i += 1u ;
411
+ i += 1 ;
412
412
}
413
413
return Ok({opts: vec::from_slice(opts),
414
414
vals: vec::from_mut(move vals),
@@ -1275,14 +1275,17 @@ mod tests {
1275
1275
1276
1276
#[test]
1277
1277
fn test_nospace() {
1278
- let args = ~[~" -Lfoo "];
1279
- let opts = ~[optmulti(~" L ")];
1278
+ let args = ~[~" -Lfoo ", ~" - M . " ];
1279
+ let opts = ~[optmulti(~" L "), optmulti(~" M ") ];
1280
1280
let matches = &match getopts(args, opts) {
1281
1281
result::Ok(move m) => m,
1282
1282
result::Err(_) => fail
1283
1283
};
1284
1284
assert opts_present(matches, ~[~" L "]);
1285
1285
assert opts_str(matches, ~[~" L "]) == ~" foo";
1286
+ assert opts_present(matches, ~[~" M "]);
1287
+ assert opts_str(matches, ~[~" M "]) == ~" . ";
1288
+
1286
1289
}
1287
1290
1288
1291
#[test]
0 commit comments