Appearance
| 1 | namespace Driver is | |
| 2 | use Collections; | |
| 3 | ||
| 4 | class ARGUMENTS_PARSER is | |
| 5 | init() is | |
| 6 | ||
| 7 | si | |
| 8 | ||
| 9 | parse_arguments(arguments: string) -> Iterable[string] => val | |
| 10 | let results = LIST(); | |
| 11 | ||
| 12 | let input = arguments.iterator; | |
| 13 | ||
| 14 | let more mut = input.move_next(); | |
| 15 | ||
| 16 | while more do | |
| 17 | more = _skip_whitespace(input); | |
| 18 | ||
| 19 | if !more then | |
| 20 | return results; | |
| 21 | fi | |
| 22 | ||
| 23 | let argument: string mut; | |
| 24 | ||
| 25 | (argument, more) = | |
| 26 | if input.current == '"' \/ input.current == '\'' then | |
| 27 | _parse_quoted_argument(input, input.current) | |
| 28 | else | |
| 29 | _parse_unquoted_argument(input) | |
| 30 | fi; | |
| 31 | ||
| 32 | results.add(argument); | |
| 33 | od | |
| 34 | ||
| 35 | results; | |
| 36 | lav; | |
| 37 | ||
| 38 | _skip_whitespace(input: Iterator[char]) -> bool is | |
| 39 | let more mut = true; | |
| 40 | ||
| 41 | while more /\ char.is_white_space(input.current) do | |
| 42 | more = input.move_next(); | |
| 43 | od | |
| 44 | ||
| 45 | return more; | |
| 46 | si | |
| 47 | ||
| 48 | _parse_quoted_argument(input: Iterator[char], quote: char) -> (argument: string, more: bool) is | |
| 49 | // FIXME: doesn't support nested/escaped quotes, but neither do the MSBuild targets | |
| 50 | let result = System.Text.StringBuilder(); | |
| 51 | ||
| 52 | let more mut = input.move_next(); // skip opening quote | |
| 53 | ||
| 54 | while more /\ input.current != quote do | |
| 55 | result.append(input.current); | |
| 56 | ||
| 57 | more = input.move_next(); | |
| 58 | od | |
| 59 | ||
| 60 | return (result.to_string(), more /\ input.move_next()); | |
| 61 | si | |
| 62 | ||
| 63 | _parse_unquoted_argument(input: Iterator[char]) -> (argument: string, more: bool) is | |
| 64 | let result = System.Text.StringBuilder(); | |
| 65 | let more mut = true; | |
| 66 | ||
| 67 | while more /\ !char.is_white_space(input.current) do | |
| 68 | result.append(input.current); | |
| 69 | ||
| 70 | more = input.move_next(); | |
| 71 | od | |
| 72 | ||
| 73 | return (result.to_string(), more); | |
| 74 | si | |
| 75 | si | |
| 76 | si |