Skip to content
← Back

src/driver/arguments_parser.ghul

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