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] => (
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
)
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