public IEnumerable ParseServiceMessages()

in TeamCity.ServiceMessages/Read/ServiceMessageParser.cs [31:154]


        public IEnumerable<IServiceMessage> ParseServiceMessages(TextReader reader)
        {
            if (reader == null) throw new ArgumentNullException(nameof(reader));
            var startWith = ServiceMessageConstants.ServiceMessageOpen.ToCharArray();
            while (true)
            {
                var currentSymbol = 0;
                int symbol;
                while ((symbol = reader.Read()) >= 0)
                {
                    var c = (char) symbol;
                    if (c != startWith[currentSymbol])
                    {
                        //This was not a service message, let's try again in the next char
                        currentSymbol = 0;
                    }
                    else
                    {
                        currentSymbol++;
                        if (currentSymbol >= startWith.Length) break;
                    }
                }
                if (symbol < 0) yield break;

                //there was ##teamcity[ parsed
                if (currentSymbol != startWith.Length) yield break;

                var messageName = new StringBuilder();
                while ((symbol = reader.Read()) >= 0 && !char.IsWhiteSpace((char) symbol))
                    messageName.Append((char) symbol);
                if (symbol < 0) yield break;

                while ((symbol = reader.Read()) >= 0 && char.IsWhiteSpace((char) symbol))
                {
                }

                if (symbol < 0) yield break;

                if (symbol == '\'')
                {
                    var buffer = new List<char>();
                    while ((symbol = reader.Read()) >= 0)
                    {
                        var ch = (char) symbol;
                        if (ch == '|')
                        {
                            buffer.Add(ch);
                            symbol = reader.Read();
                            if (symbol < 0) yield break;
                            buffer.Add((char) symbol);
                        }
                        else
                        {
                            if (ch == '\'') break;
                            buffer.Add(ch);
                        }
                    }
                    if (symbol < 0) yield break;

                    while ((symbol = reader.Read()) >= 0 && char.IsWhiteSpace((char) symbol))
                    {
                    }

                    if (symbol < 0) yield break;

                    if (symbol == ']')
                        yield return new ServiceMessage(messageName.ToString(), ServiceMessageReplacements.Decode(buffer.ToArray()));
                }
                else
                {
                    var paramz = new Dictionary<string, string>();

                    while (true)
                    {
                        var name = new StringBuilder();
                        name.Append((char) symbol);

                        while ((symbol = reader.Read()) >= 0 && symbol != '=')
                            name.Append((char) symbol);
                        if (symbol < 0) yield break;

                        while ((symbol = reader.Read()) >= 0 && char.IsWhiteSpace((char) symbol))
                        {
                        }

                        if (symbol < 0) yield break;

                        if (symbol != '\'')
                            break;

                        var buffer = new List<char>();
                        while ((symbol = reader.Read()) >= 0)
                        {
                            var ch = (char) symbol;
                            if (ch == '|')
                            {
                                buffer.Add(ch);
                                symbol = reader.Read();
                                if (symbol < 0) yield break;
                                buffer.Add((char) symbol);
                            }
                            else
                            {
                                if (ch == '\'') break;
                                buffer.Add(ch);
                            }
                        }
                        if (symbol < 0) yield break;
                        paramz[name.ToString().Trim()] = ServiceMessageReplacements.Decode(buffer.ToArray());

                        while ((symbol = reader.Read()) >= 0 && char.IsWhiteSpace((char) symbol))
                        {
                        }

                        if (symbol < 0) yield break;
                        if (symbol == ']')
                        {
                            yield return new ServiceMessage(messageName.ToString(), null, paramz);
                            break;
                        }
                    }
                }
            }
        }