@@ -13,6 +13,7 @@ extension ByteBuffer {
1313
1414package struct GDBHostCommandDecoder : ByteToMessageDecoder {
1515 enum Error : Swift . Error {
16+ case expectedAck
1617 case expectedCommandStart
1718 case unknownCommandKind( String )
1819 case expectedChecksum
@@ -35,25 +36,41 @@ package struct GDBHostCommandDecoder: ByteToMessageDecoder {
3536 UInt8 ( self . accummulatedSum % 256 )
3637 }
3738
39+ private var isNoAckModeRequested = false
40+ private var isNoAckModeActive = false
41+
3842 mutating package func decode( buffer: inout ByteBuffer ) throws -> GDBPacket < GDBHostCommand > ? {
39- guard let firstStartDelimiter = self . accumulatedDelimiter ?? buffer. readInteger ( as: UInt8 . self) else {
43+ guard var startDelimiter = self . accumulatedDelimiter ?? buffer. readInteger ( as: UInt8 . self) else {
4044 // Not enough data to parse.
4145 return nil
4246 }
43- guard let secondStartDelimiter = buffer. readInteger ( as: UInt8 . self) else {
44- // Preserve what we already read.
45- self . accumulatedDelimiter = firstStartDelimiter
4647
47- // Not enough data to parse.
48- return nil
48+ if !isNoAckModeActive {
49+ let firstStartDelimiter = startDelimiter
50+
51+ guard firstStartDelimiter == UInt8 ( ascii: " + " ) else {
52+ logger. error ( " unexpected ack character: \( Character ( UnicodeScalar ( startDelimiter) ) ) " )
53+ throw Error . expectedAck
54+ }
55+
56+ if isNoAckModeRequested {
57+ self . isNoAckModeActive = true
58+ }
59+
60+ guard let secondStartDelimiter = buffer. readInteger ( as: UInt8 . self) else {
61+ // Preserve what we already read.
62+ self . accumulatedDelimiter = firstStartDelimiter
63+
64+ // Not enough data to parse.
65+ return nil
66+ }
67+
68+ startDelimiter = secondStartDelimiter
4969 }
5070
5171 // Command start delimiters.
52- guard
53- firstStartDelimiter == UInt8 ( ascii: " + " )
54- && secondStartDelimiter == UInt8 ( ascii: " $ " )
55- else {
56- logger. error ( " unexpected delimiter: \( Character ( UnicodeScalar ( firstStartDelimiter) ) ) \( Character ( UnicodeScalar ( secondStartDelimiter) ) ) " )
72+ guard startDelimiter == UInt8 ( ascii: " $ " ) else {
73+ logger. error ( " unexpected delimiter: \( Character ( UnicodeScalar ( startDelimiter) ) ) " )
5774 throw Error . expectedCommandStart
5875 }
5976
@@ -106,6 +123,10 @@ package struct GDBHostCommandDecoder: ByteToMessageDecoder {
106123 throw Error . checksumIncorrect
107124 }
108125
126+ if commandKind == . startNoAckMode {
127+ self . isNoAckModeRequested = true
128+ }
129+
109130 return . init(
110131 payload: . init(
111132 kind: commandKind,
0 commit comments