Ejemplo n.º 1
0
        public T ParseNamedBlock <T>(
            Action <T, string> setNameCallback,
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = new T();

            NextTokenIf(IniTokenType.Equals);

            // In only a few places in SCShellUserInterface512.INI,
            // there are what look like accidental spaces in the MappedImage names.
            var name = ParseString(allowWhitespace: true).Replace(" ", string.Empty);

            setNameCallback(result, name);

            var errantEnd = NextTokenIf(IniTokenType.Identifier);

            if (errantEnd != null && errantEnd.Value.StringValue != "End")
            {
                throw new IniParseException($"Unexpected identifier after block name: {errantEnd.Value.StringValue}", errantEnd.Value.Position);
            }

            NextToken(IniTokenType.EndOfLine);

            ParseBlockContent(result, fieldParserProvider);

            return(result);
        }
Ejemplo n.º 2
0
        public T ParseTopLevelBlock <T>(
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = ParseBlock(fieldParserProvider);

            return(result);
        }
Ejemplo n.º 3
0
        public T ParseTopLevelNamedBlock <T>(
            Action <T, int> setNameCallback,
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = ParseNamedBlock(setNameCallback, fieldParserProvider);

            return(result);
        }
Ejemplo n.º 4
0
        public T ParseBlock <T>(
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = new T();

            ParseBlockContent(result, fieldParserProvider);

            return(result);
        }
Ejemplo n.º 5
0
        public T ParseBlock <T>(
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = new T();

            NextToken(IniTokenType.EndOfLine);

            ParseBlockContent(result, fieldParserProvider);

            return(result);
        }
Ejemplo n.º 6
0
        public T ParseTopLevelBlock <T>(
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            NextToken();

            var result = ParseBlock(fieldParserProvider);

            NextTokenIf(IniTokenType.EndOfLine);

            return(result);
        }
Ejemplo n.º 7
0
        public T ParseTopLevelNamedBlock <T>(
            Action <T, int> setNameCallback,
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            NextToken();

            var result = ParseNamedBlock(setNameCallback, fieldParserProvider);

            NextTokenIf(IniTokenType.EndOfLine);

            return(result);
        }
Ejemplo n.º 8
0
        public T ParseNamedBlock <T>(
            Action <T, int> setNameCallback,
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = new T();

            var name = ParseInteger();

            setNameCallback(result, name);

            ParseBlockContent(result, fieldParserProvider);

            return(result);
        }
Ejemplo n.º 9
0
        public T ParseNamedBlock <T>(
            Action <T, string> setNameCallback,
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = new T();

            var name = GetNextToken();

            setNameCallback(result, name.Text);

            ParseBlockContent(result, fieldParserProvider);

            return(result);
        }
Ejemplo n.º 10
0
        private void ParseBlockContent <T>(
            T result,
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var done = false;

            while (!done)
            {
                if (_tokenReader.EndOfFile)
                {
                    throw new InvalidOperationException();
                }

                _tokenReader.GoToNextLine();

                var token = _tokenReader.NextToken(Separators);

                if (token == null)
                {
                    continue;
                }

                if (string.Equals(token.Value.Text, EndToken, StringComparison.InvariantCultureIgnoreCase))
                {
                    done = true;
                }
                else
                {
                    var fieldName = token.Value.Text;

                    if (fieldParserProvider.TryGetFieldParser(fieldName, out var fieldParser))
                    {
                        _currentBlockOrFieldStack.Push(fieldName);

                        fieldParser(this, result);

                        _currentBlockOrFieldStack.Pop();
                    }
                    else
                    {
                        throw new IniParseException($"Unexpected field '{fieldName}' in block '{_currentBlockOrFieldStack.Peek()}'.", token.Value.Position);
                    }
                }
            }
        }
Ejemplo n.º 11
0
        private void ParseBlockContent <T>(
            T result,
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            while (Current.TokenType == IniTokenType.Identifier || Current.TokenType == IniTokenType.IntegerLiteral)
            {
                if (Current.TokenType == IniTokenType.Identifier && Current.StringValue.ToUpper() == "END")
                {
                    NextToken();

                    // ODDITY: ZH AmericaVehicle.ini:1993 has Upgrade_AmericaHellfireDrone after "End"
                    NextTokenIf(IniTokenType.Identifier);

                    break;
                }
                else
                {
                    var fieldName = Current.TokenType == IniTokenType.Identifier
                        ? Current.StringValue
                        : Current.IntegerValue.ToString();

                    if (fieldParserProvider.TryGetFieldParser(fieldName, out var fieldParser))
                    {
                        _currentBlockOrFieldStack.Push(fieldName);

                        NextToken();
                        NextTokenIf(IniTokenType.Equals);

                        // ODDITY: FactionBuilding.ini:13383 has a redundant =
                        NextTokenIf(IniTokenType.Equals);

                        fieldParser(this, result);

                        NextToken(IniTokenType.EndOfLine);

                        _currentBlockOrFieldStack.Pop();
                    }
                    else
                    {
                        throw new IniParseException($"Unexpected field '{fieldName}' in block '{_currentBlockOrFieldStack.Peek()}'.", Current.Position);
                    }
                }
            }
        }
Ejemplo n.º 12
0
        public T ParseAttributeList <T>(
            IIniFieldParserProvider <T> fieldParserProvider)
            where T : class, new()
        {
            var result = new T();

            var done = false;

            while (!done)
            {
                if (_tokenReader.EndOfFile)
                {
                    throw new InvalidOperationException();
                }

                var nameToken = GetNextTokenOptional(SeparatorsColon);
                if (!nameToken.HasValue)
                {
                    break;
                }

                var fieldName = nameToken.Value.Text;
                if (fieldParserProvider.TryGetFieldParser(fieldName, out var fieldParser))
                {
                    _currentBlockOrFieldStack.Push(fieldName);

                    fieldParser(this, result);

                    _currentBlockOrFieldStack.Pop();
                }
                else
                {
                    throw new IniParseException($"Unexpected field '{fieldName}' in block '{_currentBlockOrFieldStack.Peek()}'.", nameToken.Value.Position);
                }
            }

            return(result);
        }