public ReadResults ReadString(out JsonString result)
        {
            result = default;
            string actualString = "";

            if (!StringReader.CanRead() || StringReader.Peek() != STRING_CHARACTER)
            {
                return(ReadResults.Failure(JsonCommandError.MalformedJson().WithContext(StringReader)));
            }
            StringReader.Skip();

            bool escaped = false;

            while (StringReader.CanRead())
            {
                char c = StringReader.Read();
                if (escaped)
                {
                    if (c == UNICODE_CHARACTER)
                    {
                        if (!StringReader.CanRead(4))
                        {
                            return(ReadResults.Failure(JsonCommandError.UnterminatedEscapeSequence().WithContext(StringReader)));
                        }
                        string unicode = StringReader.Read(4);
                        if (!short.TryParse(unicode, NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo, out _))
                        {
                            return(ReadResults.Failure(JsonCommandError.InvalidUnicodeCharacter(unicode).WithContext(StringReader)));
                        }
                        escaped       = false;
                        actualString += c + unicode;
                    }
                    else if (ESCAPABLE_CHARACTERS.Contains(c))
                    {
                        escaped       = false;
                        actualString += c;
                    }
                    else
                    {
                        return(ReadResults.Failure(JsonCommandError.InvalidEscapeSequence().WithContext(StringReader)));
                    }
                }
                else if (c == ESCAPE_CHARACTER)
                {
                    escaped       = true;
                    actualString += c;
                }
                else if (c == STRING_CHARACTER)
                {
                    result = new JsonString(actualString);
                    return(ReadResults.Success());
                }
                else
                {
                    actualString += c;
                }
            }

            return(ReadResults.Failure(JsonCommandError.UnterminatedString().WithContext(StringReader)));
        }
        private IList <Function> ParseFunctions(BinaryReaderX br, Xq32Header header, IList <Jump> jumps, IList <Instruction> instructions)
        {
            var functionStream = Decompress(br.BaseStream, header.table0Offset << 2);
            var functions      = new BinaryReaderX(functionStream).ReadMultiple <Xq32Function>(header.table0EntryCount);

            var result = new List <Function>();

            foreach (var function in functions.OrderBy(x => x.instructionOffset))
            {
                var functionName         = _stringReader.Read(function.nameOffset);
                var functionInstructions = instructions
                                           .Skip(function.instructionOffset)
                                           .Take(function.instructionEndOffset - function.instructionOffset)
                                           .ToArray();

                var functionJumps = jumps
                                    .Skip(function.jumpOffset)
                                    .Take(function.jumpCount)
                                    .ToArray();

                var functionUnknowns = new int[] { function.unk1, function.unk2 };

                result.Add(new Function(functionName, function.parameterCount, functionJumps, functionInstructions, functionUnknowns));
            }

            return(result);
        }
        private static ReadResults ReadScores(EntitySelectorParser parser, IStringReader reader)
        {
            ReadResults readResults = reader.Expect('{');

            if (!readResults.Successful)
            {
                return(readResults);
            }

            reader.SkipWhitespace();
            while (reader.CanRead() && reader.Peek() != '}')
            {
                reader.SkipWhitespace();
                readResults = reader.ReadUnquotedString(out _);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                readResults = reader.Expect('=');
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                readResults = new RangeParser <int>(reader).Read(int.TryParse, CommandError.InvalidInteger, int.MinValue, int.MaxValue, false, out Range <int> range);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                parser.AddArgument(new ParsedArgument <Range <int> >(range, false));
                reader.SkipWhitespace();
                if (reader.CanRead())
                {
                    char c = reader.Read();
                    if (c == ',')
                    {
                        continue;
                    }
                    if (c == '}')
                    {
                        return(ReadResults.Success());
                    }
                }
                return(ReadResults.Failure(CommandError.ExpectedCharacter('}').WithContext(reader)));
            }

            reader.SkipWhitespace();
            return(reader.Expect('}'));
        }
Exemple #4
0
        private ReadResults ReadArrayTag(out INbtTag result)
        {
            result = default;
            ReadResults readResults = Reader.Expect('[');

            if (!readResults.Successful)
            {
                return(readResults);
            }
            int  start = Reader.GetCursor();
            char type  = Reader.Read();

            Reader.Skip();
            Reader.SkipWhitespace();
            if (!Reader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedValue().WithContext(Reader)));
            }

            INbtCollectionTag list;

            switch (type)
            {
            case 'B':
                list = new ByteArrayNbtTag();
                break;

            case 'I':
                list = new IntegerArrayNbtTag();
                break;

            case 'L':
                list = new LongArrayNbtTag();
                break;

            default:
                Reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.InvalidArrayType(type).WithContext(Reader)));
            }
            readResults = ReadListContents(ref list);
            if (readResults.Successful)
            {
                result = list;
            }
            return(readResults);
        }
Exemple #5
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out HashSet <char> result)
        {
            result = new HashSet <char>();
            int start = reader.GetCursor();

            while (!reader.AtEndOfArgument())
            {
                char c = reader.Read();
                if (!Characters.Contains(c) || result.Contains(c))
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.InvalidSwizzle(Characters).WithContext(reader)));
                }
                result.Add(c);
            }
            return(ReadResults.Success());
        }
Exemple #6
0
        public Line Read()
        {
            string value;

            do
            {
                value = stringReader.Read();
                if (value == null)
                {
                    return(null);
                }
                index++;
            } while (discardMatcher.Match(value));

            return(new Line()
            {
                Value = value, Index = index - 1
            });
        }
        public IList <T> Read()
        {
            if (xmlReader != null)
            {
                return(xs.Deserialize(xmlReader) as IList <T>);
            }

            if (textReader != null)
            {
                return(xs.Deserialize(textReader) as List <T>);
            }

            if (stringReader != null)
            {
                xml = stringReader.Read();
            }

            using (StringReader r = new StringReader(xml))
                return(xs.Deserialize(r) as IList <T>);
        }
 public TextFileWriterBlock(IStringReader pathReader, Encoding encoding, Boolean isAppending)
 {
     this.filePathBuilder = new FilePathBuilderBlock(pathReader.Read());
     this.encoding        = encoding;
     this.isAppending     = isAppending;
 }
        private static ReadResults ReadAdvancements(EntitySelectorParser parser, IStringReader reader)
        {
            ReadResults readResults = reader.Expect('{');

            if (!readResults.Successful)
            {
                return(readResults);
            }

            reader.SkipWhitespace();
            while (reader.CanRead() && reader.Peek() != '}')
            {
                reader.SkipWhitespace();
                readResults = ResourceLocation.TryRead(reader, out ResourceLocation advancement);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                readResults = reader.Expect('=');
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                if (reader.CanRead() && reader.Peek() == '{')
                {
                    reader.Skip();
                    reader.SkipWhitespace();
                    while (reader.CanRead() && reader.Peek() != '}')
                    {
                        reader.SkipWhitespace();
                        readResults = reader.ReadUnquotedString(out _);
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }

                        reader.SkipWhitespace();
                        readResults = reader.Expect('=');
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }

                        reader.SkipWhitespace();
                        readResults = reader.ReadBoolean(out _);
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }

                        reader.SkipWhitespace();
                        if (reader.CanRead())
                        {
                            char c = reader.Read();
                            if (c == ',')
                            {
                                continue;
                            }
                            if (c == '}')
                            {
                                break;
                            }
                        }
                    }
                }
                else
                {
                    readResults = reader.ReadBoolean(out _);
                    if (!readResults.Successful)
                    {
                        return(readResults);
                    }
                }

                parser.AddArgument(new ParsedArgument <Advancement>(new Advancement(advancement), false));
                reader.SkipWhitespace();
                if (reader.CanRead())
                {
                    char c = reader.Read();
                    if (c == ',')
                    {
                        continue;
                    }
                    if (c == '}')
                    {
                        return(ReadResults.Success());
                    }
                }
                return(ReadResults.Failure(CommandError.ExpectedCharacter('}').WithContext(reader)));
            }

            reader.SkipWhitespace();
            return(reader.Expect('}'));
        }
        private ReadResults ParseSelector()
        {
            if (!Reader.CanRead())
            {
                Reader.SetCursor(Start);
                return(ReadResults.Failure(CommandError.MissingSelectorType().WithContext(Reader)));
            }
            int  currentPosition = Reader.GetCursor();
            char c = Reader.Read();

            switch (c)
            {
            case 'p':
                MaxResults       = 1;
                IncludesEntities = false;
                IsSelf           = false;
                SelectorType     = SelectorType.NearestPlayer;
                TypeLimited      = true;
                Sorted           = false;
                break;

            case 'a':
                MaxResults       = int.MaxValue;
                IncludesEntities = false;
                IsSelf           = false;
                SelectorType     = SelectorType.AllPlayers;
                TypeLimited      = true;
                Sorted           = false;
                break;

            case 'r':
                MaxResults       = 1;
                IncludesEntities = false;
                IsSelf           = false;
                SelectorType     = SelectorType.RandomPlayer;
                TypeLimited      = true;
                Sorted           = false;
                break;

            case 's':
                MaxResults       = 1;
                IncludesEntities = false;
                IsSelf           = true;
                SelectorType     = SelectorType.Self;
                TypeLimited      = false;
                Sorted           = true;
                break;

            case 'e':
                MaxResults       = int.MaxValue;
                IncludesEntities = true;
                IsSelf           = false;
                SelectorType     = SelectorType.AllEntities;
                TypeLimited      = false;
                Sorted           = false;
                break;

            default:
                Reader.SetCursor(currentPosition);
                return(ReadResults.Failure(CommandError.UnknownSelectorType(c).WithContext(Reader)));
            }
            if (UseBedrock)
            {
                currentPosition = Reader.GetCursor();
                Reader.SkipWhitespace();
                if (!Reader.CanRead() || Reader.Peek() != '[')
                {
                    Reader.SetCursor(currentPosition);
                }
            }
            if (Reader.CanRead() && Reader.Peek() == '[')
            {
                Reader.Skip();
                ReadResults readResults = ParseOptions();
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }
            return(ReadResults.Success());
        }
        public string GetString(int subType, IStringReader stringReader)
        {
            string value;

            switch (Type)
            {
            // Integer
            case 1:
                value = $"{Value}";
                break;

            // Unsigned Integer
            case 2:
                if (subType == 0x14 || subType == 0x1E || subType == 0x1F || subType == 0x21)
                {
                    var foundString = stringReader.GetByHash((uint)Value);
                    if (foundString == null)
                    {
                        value = $"{Value}";
                        break;
                    }

                    value = $"\"{foundString}\"";
                    break;
                }

                value = $"{Value}";
                break;

            // Float
            case 3:
                value = $"{BitConverter.Int32BitsToSingle((int)Value).ToString(CultureInfo.GetCultureInfo("en-gb"))}";
                break;

            // Execution Context values
            case 4:
                // 4000+ ?
                // Values 3000+ are input parameters to the method
                // 2000+ ?
                // Values 1000+ are stack values
                value = "$";
                if (Value >= 1000 && Value <= 1999)
                {
                    value += $"v{Value - 1000}";
                }
                if (Value >= 2000 && Value <= 2999)
                {
                    value += $"x{Value - 2000}";
                }
                if (Value >= 3000 && Value <= 3999)
                {
                    value += $"p{Value - 3000}";
                }
                if (Value >= 4000 && Value <= 4999)
                {
                    value += $"y{Value - 4000}";
                }
                break;

            // String
            case 24:
                value = $"\"{stringReader.Read(Value)}\"";
                break;

            // Method Name
            case 25:
                value = $"\"{stringReader.Read(Value)}\"";
                break;

            default:
                throw new InvalidOperationException($"Unknown type {Type}.");
            }

            return(value + $"<{Type}>");
        }