@@ -13,6 +13,7 @@ private enum Boundary
13
13
{
14
14
TokenStart ,
15
15
WordEnd ,
16
+ QuoteStart ,
16
17
QuoteEnd
17
18
}
18
19
@@ -25,52 +26,63 @@ public IEnumerable<string> Split(string commandLine)
25
26
var pos = 0 ;
26
27
27
28
var seeking = Boundary . TokenStart ;
28
- int ? skipQuoteAtIndex = null ;
29
+ var seekingQuote = Boundary . QuoteStart ;
29
30
30
31
while ( pos < memory . Length )
31
32
{
32
33
var c = memory . Span [ pos ] ;
33
34
34
35
if ( char . IsWhiteSpace ( c ) )
35
36
{
36
- switch ( seeking )
37
+ if ( seekingQuote == Boundary . QuoteStart )
37
38
{
38
- case Boundary . WordEnd :
39
- yield return CurrentToken ( ) ;
40
- startTokenIndex = pos ;
41
- seeking = Boundary . TokenStart ;
42
- break ;
43
-
44
- case Boundary . TokenStart :
45
- startTokenIndex = pos ;
46
- break ;
47
-
48
- case Boundary . QuoteEnd :
49
- break ;
39
+ switch ( seeking )
40
+ {
41
+ case Boundary . WordEnd :
42
+ yield return CurrentToken ( ) ;
43
+ startTokenIndex = pos ;
44
+ seeking = Boundary . TokenStart ;
45
+ break ;
46
+
47
+ case Boundary . TokenStart :
48
+ startTokenIndex = pos ;
49
+ break ;
50
+ }
50
51
}
51
52
}
52
53
else if ( c == '\" ' )
53
54
{
54
- switch ( seeking )
55
+ if ( seeking == Boundary . TokenStart )
55
56
{
56
- case Boundary . QuoteEnd :
57
- yield return CurrentToken ( ) ;
58
- startTokenIndex = pos ;
59
- seeking = Boundary . TokenStart ;
60
- break ;
61
-
62
- case Boundary . TokenStart :
63
- startTokenIndex = pos + 1 ;
64
- seeking = Boundary . QuoteEnd ;
65
- break ;
66
-
67
- case Boundary . WordEnd :
68
- seeking = Boundary . QuoteEnd ;
69
- skipQuoteAtIndex = pos ;
70
- break ;
57
+ switch ( seekingQuote )
58
+ {
59
+ case Boundary . QuoteEnd :
60
+ yield return CurrentToken ( ) ;
61
+ startTokenIndex = pos ;
62
+ seekingQuote = Boundary . QuoteStart ;
63
+ break ;
64
+
65
+ case Boundary . QuoteStart :
66
+ startTokenIndex = pos + 1 ;
67
+ seekingQuote = Boundary . QuoteEnd ;
68
+ break ;
69
+ }
70
+ }
71
+ else
72
+ {
73
+ switch ( seekingQuote )
74
+ {
75
+ case Boundary . QuoteEnd :
76
+ seekingQuote = Boundary . QuoteStart ;
77
+ break ;
78
+
79
+ case Boundary . QuoteStart :
80
+ seekingQuote = Boundary . QuoteEnd ;
81
+ break ;
82
+ }
71
83
}
72
84
}
73
- else if ( seeking == Boundary . TokenStart )
85
+ else if ( seeking == Boundary . TokenStart && seekingQuote == Boundary . QuoteStart )
74
86
{
75
87
seeking = Boundary . WordEnd ;
76
88
startTokenIndex = pos ;
@@ -95,29 +107,7 @@ public IEnumerable<string> Split(string commandLine)
95
107
96
108
string CurrentToken ( )
97
109
{
98
- if ( skipQuoteAtIndex is null )
99
- {
100
- return memory . Slice (
101
- startTokenIndex ,
102
- IndexOfEndOfToken ( ) )
103
- . ToString ( ) ;
104
- }
105
- else
106
- {
107
- var beforeQuote = memory . Slice (
108
- startTokenIndex ,
109
- skipQuoteAtIndex . Value - startTokenIndex ) ;
110
-
111
- var indexOfCharAfterQuote = skipQuoteAtIndex . Value + 1 ;
112
-
113
- var afterQuote = memory . Slice (
114
- indexOfCharAfterQuote ,
115
- pos - skipQuoteAtIndex . Value - 1 ) ;
116
-
117
- skipQuoteAtIndex = null ;
118
-
119
- return $ "{ beforeQuote } { afterQuote } ";
120
- }
110
+ return memory . Slice ( startTokenIndex , IndexOfEndOfToken ( ) ) . ToString ( ) . Replace ( "\" " , "" ) ;
121
111
}
122
112
123
113
int IndexOfEndOfToken ( ) => pos - startTokenIndex ;
0 commit comments