private MutableString/*!*/ ConsumeLine(RubyEncoding/*!*/ encoding, int lineLength, int consume, bool bufferResized) {
Debug.Assert(consume >= lineLength);
Debug.Assert(consume <= _bufferCount);
MutableString line;
if (bufferResized || _bufferStart == 0 && !Utils.IsSparse(lineLength, _buffer.Length)) {
Debug.Assert(_bufferStart == 0);
line = new MutableString(_buffer, lineLength, encoding);
if (_bufferCount > consume) {
var newBuffer = new byte[Math.Max(_defaultBufferSize, _bufferCount - consume)];
Buffer.BlockCopy(_buffer, consume, newBuffer, 0, _bufferCount - consume);
_buffer = newBuffer;
} else {
_buffer = null;
}
// consume as if we kept the same buffer and then adjust start:
ConsumeBuffered(consume);
_bufferStart = 0;
} else {
line = MutableString.CreateBinary(encoding).Append(_buffer, _bufferStart, lineLength);
ConsumeBuffered(consume);
}
return line;
}