private DSCToken ReadUntil(string prefix, DSCTokenEnding end)
{
int c;
DSCToken token = new DSCToken();
token.StartPosition = _bufferedStream.Position - prefix.Length;
StringBuilder text = new StringBuilder(prefix, 64);
int lastAppendedChar = 0;
while ((c = this.ReadChar()) > -1)
{
if (c == '\n' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd)
{
token.Length = _bufferedStream.Position - 1 - token.StartPosition;
token.Text = text.ToString().Trim();
token.Ending = DSCTokenEnding.LineEnd;
return token;
}
else if (c == '\r' && this.ReadChar() == '\n' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd)
{
token.Length = _bufferedStream.Position - 2 - token.StartPosition;
token.Text = text.ToString().Trim();
token.Ending = DSCTokenEnding.LineEnd;
return token;
}
else if (c == ' ' && text.Length > 0 && lastAppendedChar != ' ' && (end & DSCTokenEnding.Whitespace) == DSCTokenEnding.Whitespace)
{
token.Length = _bufferedStream.Position - 1 - token.StartPosition;
token.Text = text.ToString().Trim();
token.Ending = DSCTokenEnding.Whitespace;
return token;
}
else
{
text.Append((char)c);
lastAppendedChar = c;
}
}
return null;
}