Ghostscript.NET.Viewer.DSC.DSCTokenizer.ReadUntil C# (CSharp) Method

ReadUntil() private method

private ReadUntil ( string prefix, DSCTokenEnding end ) : DSCToken
prefix string
end DSCTokenEnding
return DSCToken
        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;
        }