@@ -29,6 +29,7 @@ object CommandLineParser:
29
29
inline def bump () = pos += 1
30
30
inline def done = pos >= line.length
31
31
32
+ // Skip to the next quote as given; false on no more input.
32
33
def skipToQuote (q : Int ): Boolean =
33
34
var escaped = false
34
35
def terminal = cur match
@@ -39,13 +40,18 @@ object CommandLineParser:
39
40
while ! terminal do bump()
40
41
! done
41
42
42
- @ tailrec def skipToDelim (): Boolean =
43
+ // Skip to a word boundary, where words can be quoted and quotes can be escaped; false on missing quote.
44
+ def skipToDelim (): Boolean =
45
+ var escaped = false
43
46
inline def quote () = { qpos += pos ; bump() }
44
- cur match
47
+ def advance (): Boolean = cur match
48
+ case _ if escaped => escaped = false ; bump() ; advance()
49
+ case '\\ ' => escaped = true ; bump() ; advance()
45
50
case q @ (DQ | SQ ) => { quote() ; skipToQuote(q) } && { quote() ; skipToDelim() }
46
51
case - 1 => true
47
52
case c if isWhitespace(c) => true
48
53
case _ => bump(); skipToDelim()
54
+ advance()
49
55
50
56
def copyText (): String =
51
57
val buf = new java.lang.StringBuilder
@@ -74,7 +80,7 @@ object CommandLineParser:
74
80
75
81
inline def badquote () = errorFn(s " Unmatched quote [ ${qpos.last}]( ${line.charAt(qpos.last)}) " )
76
82
77
- inline def skipWhitespace () = while isWhitespace(cur) do pos += 1
83
+ inline def skipWhitespace () = while isWhitespace(cur) do bump()
78
84
79
85
@ tailrec def loop (): List [String ] =
80
86
skipWhitespace()
@@ -85,7 +91,7 @@ object CommandLineParser:
85
91
badquote()
86
92
Nil
87
93
else
88
- accum = text() :: accum
94
+ accum :: = text()
89
95
loop()
90
96
end loop
91
97
0 commit comments