public IEnumerable GetTokens()

in iothub/device/src/Common/UrlEncodedDictionarySerializer.cs [207:340]


            public IEnumerable<Token> GetTokens()
            {
                if (_position >= _value.Length)
                {
                    yield break;
                }
                int readCount = 0;
                bool readCompleted = false;
                string errorMessage = null;
                while (!readCompleted)
                {
                    switch (_currentState)
                    {
                        case TokenizerState.ReadyToReadKey:
                            {
                                if (_position >= _value.Length)
                                {
                                    errorMessage = "Unexpected string end in '{0}' state.".FormatInvariant(_currentState);
                                    _currentState = TokenizerState.Error;
                                    break;
                                }
                                char currentChar = _value[_position];
                                switch (currentChar)
                                {
                                    case '=':
                                    case '&':
                                        errorMessage = "Unexpected character '{0}' in '{1}' state.".FormatInvariant(currentChar, _currentState);
                                        _currentState = TokenizerState.Error;
                                        break;

                                    case '/':
                                        _currentState = TokenizerState.Finish;
                                        break;

                                    default:
                                        readCount++;
                                        _currentState = TokenizerState.ReadKey;
                                        break;
                                }
                                break;
                            }

                        case TokenizerState.ReadKey:
                            {
                                if (_position >= _value.Length)
                                {
                                    yield return CreateToken(TokenType.Key, readCount);
                                    yield return CreateToken(TokenType.Value, 0);
                                    readCount = 0;
                                    _currentState = TokenizerState.Finish;
                                    break;
                                }
                                char currentChar = _value[_position];
                                switch (currentChar)
                                {
                                    case '=':
                                        yield return CreateToken(TokenType.Key, readCount);
                                        readCount = 0;
                                        _currentState = TokenizerState.ReadValue;
                                        break;

                                    case '&':
                                        yield return CreateToken(TokenType.Key, readCount);
                                        yield return CreateToken(TokenType.Value, 0);
                                        readCount = 0;
                                        _currentState = TokenizerState.ReadyToReadKey;
                                        break;

                                    case '/':
                                        yield return CreateToken(TokenType.Key, readCount);
                                        yield return CreateToken(TokenType.Value, 0);
                                        readCount = 0;
                                        _currentState = TokenizerState.Finish;
                                        break;

                                    default:
                                        readCount++;
                                        break;
                                }
                                break;
                            }

                        case TokenizerState.ReadValue:
                            {
                                if (_position >= _value.Length)
                                {
                                    yield return CreateToken(TokenType.Value, readCount);
                                    readCount = 0;
                                    _currentState = TokenizerState.Finish;
                                    break;
                                }
                                char currentChar = _value[_position];
                                switch (currentChar)
                                {
                                    case '=':
                                        errorMessage = "Unexpected character '{0}' in '{1}' state.".FormatInvariant(currentChar, _currentState);
                                        _currentState = TokenizerState.Error;
                                        break;

                                    case '&':
                                        yield return CreateToken(TokenType.Value, readCount);
                                        readCount = 0;
                                        _currentState = TokenizerState.ReadyToReadKey;
                                        break;

                                    case '/':
                                        yield return CreateToken(TokenType.Value, readCount);
                                        readCount = 0;
                                        _currentState = TokenizerState.Finish;
                                        break;

                                    default:
                                        readCount++;
                                        break;
                                }
                                break;
                            }

                        case TokenizerState.Finish:
                        case TokenizerState.Error:
                            readCompleted = true;
                            break;

                        default:
                            throw new NotSupportedException();
                    }
                    _position++;
                }

                if (_currentState == TokenizerState.Error)
                {
                    throw new FormatException(errorMessage);
                }
            }