Open whole buffer for writing in update_buffer.
diff --git a/reader_c.go b/reader_c.go index f222c6c..c732935 100644 --- a/reader_c.go +++ b/reader_c.go
@@ -111,16 +111,19 @@ } // Move the unread characters to the beginning of the buffer. - if parser.buffer_pos > 0 && parser.buffer_pos < len(parser.buffer) { - size := len(parser.buffer) - parser.buffer_pos + buffer_len := len(parser.buffer) + if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { copy(parser.buffer, parser.buffer[parser.buffer_pos:]) + buffer_len -= parser.buffer_pos parser.buffer_pos = 0 - parser.buffer = parser.buffer[:size] - } else if parser.buffer_pos == len(parser.buffer) { + } else if parser.buffer_pos == buffer_len { + buffer_len = 0 parser.buffer_pos = 0 - parser.buffer = parser.buffer[:0] } + // Open the whole buffer for writing, and cut it before returning. + parser.buffer = parser.buffer[:cap(parser.buffer)] + // Fill the buffer until it has enough characters. first := true for parser.unread < length { @@ -128,6 +131,7 @@ // Fill the raw buffer if necessary. if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { if !yaml_parser_update_raw_buffer(parser) { + parser.buffer = parser.buffer[:buffer_len] return false } } @@ -349,41 +353,39 @@ parser.raw_buffer_pos += width parser.offset += width - pos := len(parser.buffer) - parser.buffer = parser.buffer[:pos+width] - // Finally put the character into the buffer. if value <= 0x7F { // 0000 0000-0000 007F . 0xxxxxxx - parser.buffer[pos+0] = byte(value) + parser.buffer[buffer_len+0] = byte(value) } else if value <= 0x7FF { // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx - parser.buffer[pos+0] = byte(0xC0 + (value >> 6)) - parser.buffer[pos+1] = byte(0x80 + (value & 0x3F)) + parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) + parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) } else if value <= 0xFFFF { // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx - parser.buffer[pos+0] = byte(0xE0 + (value >> 12)) - parser.buffer[pos+1] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[pos+2] = byte(0x80 + (value & 0x3F)) + parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) } else { // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - parser.buffer[pos+0] = byte(0xF0 + (value >> 18)) - parser.buffer[pos+1] = byte(0x80 + ((value >> 12) & 0x3F)) - parser.buffer[pos+2] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[pos+3] = byte(0x80 + (value & 0x3F)) + parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) } + buffer_len += width parser.unread++ } // On EOF, put NUL into the buffer and return. if parser.eof { - parser.buffer = parser.buffer[:len(parser.buffer)+1] - parser.buffer[len(parser.buffer)-1] = 0x00 + parser.buffer[buffer_len] = 0 + buffer_len++ parser.unread++ - return true + break } } - + parser.buffer = parser.buffer[:buffer_len] return true }