in src/Editor/Text/Impl/DifferenceAlgorithm/TFS/DiffFinder.cs [422:491]
public string NextLineToken(out EndOfLineTerminator endOfLine)
{
// The structure of this code is borrowed from StreamReader.ReadLine()
// Except that it has been extended out to support Unicode EOL characters.
m_stringBuilder.Length = 0;
endOfLine = EndOfLineTerminator.None;
if (m_currBufferPos == m_numCharsInBuffer && FillBuffer() == 0)
{
// If the buffer was empty, and we couldn't refill it, we're done.
return null;
}
do
{
int index = m_currBufferPos;
do
{
char ch = m_charBuffer[index];
if (ch == '\r' || ch == '\n' ||
(m_isUnicodeEncoding && (ch == LineSeparator || ch == ParagraphSeparator || ch == NextLine)))
{
switch ((int)ch)
{
case '\r':
endOfLine = EndOfLineTerminator.CarriageReturn;
break;
case '\n':
endOfLine = EndOfLineTerminator.LineFeed;
break;
case LineSeparator:
endOfLine = EndOfLineTerminator.LineSeparator;
break;
case ParagraphSeparator:
endOfLine = EndOfLineTerminator.ParagraphSeparator;
break;
case NextLine:
endOfLine = EndOfLineTerminator.NextLine;
break;
}
String line;
if (m_stringBuilder.Length > 0)
{
m_stringBuilder.Append(m_charBuffer, m_currBufferPos, index - m_currBufferPos);
line = m_stringBuilder.ToString();
}
else
{
line = new String(m_charBuffer, m_currBufferPos, index - m_currBufferPos);
}
m_currBufferPos = index + 1;
if (ch == '\r' && (m_currBufferPos < m_numCharsInBuffer || FillBuffer() > 0))
{
if (m_charBuffer[m_currBufferPos] == '\n')
{
endOfLine = EndOfLineTerminator.CarriageReturnLineFeed;
m_currBufferPos++;
}
}
return line;
}
index++;
} while (index < m_numCharsInBuffer);
m_stringBuilder.Append(m_charBuffer, m_currBufferPos, m_numCharsInBuffer - m_currBufferPos);
} while (FillBuffer() > 0);
return m_stringBuilder.ToString();
}