diff --git a/doc/tutorial.md b/doc/tutorial.md index e7558368b59ca..a602ed6a98139 100644 --- a/doc/tutorial.md +++ b/doc/tutorial.md @@ -53,7 +53,7 @@ import uint::range; import io::println; fn main() { - // Open a channel for receiving game results + // Open a channel to receive game results do listen |result_from_game| { let times = 10; @@ -73,24 +73,24 @@ fn main() { let winner = result_from_game.recv(); println(#fmt("%s wins round #%u", winner, round)); } + } - fn play_game(player1: str, player2: str) -> str { + fn play_game(player1: str, player2: str) -> str { - // Our rock/paper/scissors types - enum gesture { - rock, paper, scissors - } + // Our rock/paper/scissors types + enum gesture { + rock, paper, scissors + } - let rng = seeded_rng(seed()); - // A small inline function for picking an RPS gesture - let pick = || [rock, paper, scissors][rng.gen_uint() % 3]; + let rng = seeded_rng(seed()); + // A small inline function for picking an RPS gesture + let pick = || [rock, paper, scissors][rng.gen_uint() % 3]; - // Pick two gestures and decide the result - alt (pick(), pick()) { - (rock, scissors) | (paper, rock) | (scissors, paper) { copy player1 } - (scissors, rock) | (rock, paper) | (paper, scissors) { copy player2 } - _ { "tie" } - } + // Pick two gestures and decide the result + alt (pick(), pick()) { + (rock, scissors) | (paper, rock) | (scissors, paper) { copy player1 } + (scissors, rock) | (rock, paper) | (paper, scissors) { copy player2 } + _ { "tie" } } } } diff --git a/src/libstd/getopts.rs b/src/libstd/getopts.rs index a82d131f516ed..6ce9ca6072a54 100644 --- a/src/libstd/getopts.rs +++ b/src/libstd/getopts.rs @@ -220,10 +220,36 @@ fn getopts(args: ~[str], opts: ~[opt]) -> result unsafe { } } else { let mut j = 1u; + let mut last_valid_opt_id = option::none; names = ~[]; while j < curlen { let range = str::char_range_at(cur, j); - vec::push(names, short(range.ch)); + let opt = short(range.ch); + + /* In a series of potential options (eg. -aheJ), if we see + one which takes an argument, we assume all subsequent + characters make up the argument. This allows options + such as -L/usr/local/lib/foo to be interpreted correctly + */ + alt find_opt(opts, opt) { + some(id) { + last_valid_opt_id = option::some(id); + } + none { + let arg_follows = option::is_some(last_valid_opt_id) && + alt opts[option::get(last_valid_opt_id)].hasarg { + yes | maybe { true } + no { false } + }; + if arg_follows && j + 1 < curlen { + i_arg = option::some(str::slice(cur, j, curlen)); + break; + } else { + last_valid_opt_id = option::none; + } + } + } + vec::push(names, opt); j = range.next; } } @@ -857,6 +883,18 @@ mod tests { assert opts_str(match, ~["e", "encrypt"]) == "foo"; assert opts_str(match, ~["encrypt", "e"]) == "foo"; } + + #[test] + fn test_nospace() { + let args = ~["-Lfoo"]; + let opts = ~[optmulti("L")]; + let match = alt getopts(args, opts) { + result::ok(m) { m } + result::err(f) { fail; } + }; + assert opts_present(match, ~["L"]); + assert opts_str(match, ~["L"]) == "foo"; + } } // Local Variables: