Example #1
0
        public bool Compare(EvaluationParameters parameters, DecodeExpressionType comparisonType, INode left, INode right)
        {
            var evalLeft  = left.TryEvaluate(parameters);
            var evalRight = right.TryEvaluate(parameters);

            switch (comparisonType)
            {
            case DecodeExpressionType.GreaterThanOrEqualTo: {
                var iLeft  = ToInteger(evalLeft);
                var iRight = ToInteger(evalRight);
                return(iLeft >= iRight);
            }

            case DecodeExpressionType.LessThanOrEqualTo: {
                var iLeft  = ToInteger(evalLeft);
                var iRight = ToInteger(evalRight);
                return(iLeft <= iRight);
            }

            case DecodeExpressionType.Equal:
                return(ExpressionsEqual(evalLeft, evalRight));

            case DecodeExpressionType.NotEqual:
                return(!ExpressionsEqual(evalLeft, evalRight));

            default:
                throw new NotSupportedException();
            }
        }
Example #2
0
 public Parameter(DecodeExpressionType parameterType, INode parameterIndex)
 {
     if (parameterIndex == null)
         throw new ArgumentNullException("parameterIndex");
     _ParameterType = parameterType;
     _ParameterIndex = parameterIndex;
 }
 public Parameter(DecodeExpressionType parameterType, INode parameterIndex)
 {
     if (parameterIndex == null)
     {
         throw new ArgumentNullException("parameterIndex");
     }
     _ParameterType  = parameterType;
     _ParameterIndex = parameterIndex;
 }
Example #4
0
 public object this[DecodeExpressionType type, int index] {
     get {
         Parameters.ParameterBase pb;
         if (!_Parameters.TryGetValue(type, out pb))
         {
             return(FallbackValue);
         }
         return(pb[index]);
     }
     set {
         Parameters.ParameterBase pb;
         if (!_Parameters.TryGetValue(type, out pb))
         {
             throw new NotSupportedException();
         }
         pb[index] = value;
     }
 }
        protected INode DecodeExpression(BinaryReader input, DecodeExpressionType exprType)
        {
            var t = (byte)exprType;

            if (t < 0xD0)
            {
                return(new Nodes.StaticInteger(t - 1));
            }
            if (t < 0xE0)
            {
                return(new Nodes.TopLevelParameter(t - 1));
            }

            switch (exprType)
            {
            case DecodeExpressionType.Decode: {
                var len = GetInteger(input);
                return(Decode(input, len));
            }

            case DecodeExpressionType.Byte:
                return(new Nodes.StaticInteger(GetInteger(input, IntegerType.Byte)));

            case DecodeExpressionType.Int16_MinusOne:
                return(new Nodes.StaticInteger(GetInteger(input, IntegerType.Int16) - 1));

            case DecodeExpressionType.Int16_1:
            case DecodeExpressionType.Int16_2:
                return(new Nodes.StaticInteger(GetInteger(input, IntegerType.Int16)));

            case DecodeExpressionType.Int24_MinusOne:
                return(new Nodes.StaticInteger(GetInteger(input, IntegerType.Int24) - 1));

            case DecodeExpressionType.Int24:
                return(new Nodes.StaticInteger(GetInteger(input, IntegerType.Int24)));

            case DecodeExpressionType.Int24_Lsh8:
                return(new Nodes.StaticInteger(GetInteger(input, IntegerType.Int24) << 8));

            case DecodeExpressionType.Int24_SafeZero: {
                var v16 = input.ReadByte();
                var v8  = input.ReadByte();
                var v0  = input.ReadByte();

                int v = 0;
                if (v16 != byte.MaxValue)
                {
                    v |= v16 << 16;
                }
                if (v8 != byte.MaxValue)
                {
                    v |= v8 << 8;
                }
                if (v0 != byte.MaxValue)
                {
                    v |= v0;
                }

                return(new Nodes.StaticInteger(v));
            }

            case DecodeExpressionType.Int32:
                return(new Nodes.StaticInteger(GetInteger(input, IntegerType.Int32)));

            case DecodeExpressionType.GreaterThanOrEqualTo:
            case DecodeExpressionType.GreaterThan:
            case DecodeExpressionType.LessThanOrEqualTo:
            case DecodeExpressionType.LessThan:
            case DecodeExpressionType.NotEqual:
            case DecodeExpressionType.Equal: {
                var left  = DecodeExpression(input);
                var right = DecodeExpression(input);
                return(new Nodes.Comparison(exprType, left, right));
            }

            case DecodeExpressionType.IntegerParameter:
            case DecodeExpressionType.PlayerParameter:
            case DecodeExpressionType.StringParameter:
            case DecodeExpressionType.ObjectParameter:
                return(new Nodes.Parameter(exprType, DecodeExpression(input)));

            default:
                throw new NotSupportedException();
            }
        }
Example #6
0
 public Comparison(DecodeExpressionType comparisonType, INode left, INode right)
 {
     _ComparisonType = comparisonType;
     _Left           = left;
     _Right          = right;
 }
Example #7
0
        protected INode DecodeExpression(BinaryReader input, DecodeExpressionType exprType)
        {
            var t = (byte)exprType;
            if (t < 0xD0)
                return new Nodes.StaticInteger(t - 1);
            if (t < 0xE0)
                return new Nodes.TopLevelParameter(t - 1);

            switch (exprType) {
                case DecodeExpressionType.Decode: {
                        var len = GetInteger(input);
                        return Decode(input, len);
                    }
                case DecodeExpressionType.Byte:
                    return new Nodes.StaticInteger(GetInteger(input, IntegerType.Byte));
                case DecodeExpressionType.Int16_MinusOne:
                    return new Nodes.StaticInteger(GetInteger(input, IntegerType.Int16) - 1);
                case DecodeExpressionType.Int16_1:
                case DecodeExpressionType.Int16_2:
                    return new Nodes.StaticInteger(GetInteger(input, IntegerType.Int16));
                case DecodeExpressionType.Int24_MinusOne:
                    return new Nodes.StaticInteger(GetInteger(input, IntegerType.Int24) - 1);
                case DecodeExpressionType.Int24:
                    return new Nodes.StaticInteger(GetInteger(input, IntegerType.Int24));
                case DecodeExpressionType.Int24_Lsh8:
                    return new Nodes.StaticInteger(GetInteger(input, IntegerType.Int24) << 8);
                case DecodeExpressionType.Int24_SafeZero: {
                        var v16 = input.ReadByte();
                        var v8 = input.ReadByte();
                        var v0 = input.ReadByte();

                        int v = 0;
                        if (v16 != byte.MaxValue)
                            v |= v16 << 16;
                        if (v8 != byte.MaxValue)
                            v |= v8 << 8;
                        if (v0 != byte.MaxValue)
                            v |= v0;

                        return new Nodes.StaticInteger(v);
                    }
                case DecodeExpressionType.Int32:
                    return new Nodes.StaticInteger(GetInteger(input, IntegerType.Int32));
                case DecodeExpressionType.GreaterThanOrEqualTo:
                case DecodeExpressionType.GreaterThan:
                case DecodeExpressionType.LessThanOrEqualTo:
                case DecodeExpressionType.LessThan:
                case DecodeExpressionType.NotEqual:
                case DecodeExpressionType.Equal: {
                        var left = DecodeExpression(input);
                        var right = DecodeExpression(input);
                        return new Nodes.Comparison(exprType, left, right);
                    }
                case DecodeExpressionType.IntegerParameter:
                case DecodeExpressionType.PlayerParameter:
                case DecodeExpressionType.StringParameter:
                case DecodeExpressionType.ObjectParameter:
                    return new Nodes.Parameter(exprType, DecodeExpression(input));
                default:
                    throw new NotSupportedException();
            }
        }
 public object this[DecodeExpressionType type, int index]
 {
     get {
         Parameters.ParameterBase pb;
         if (!_Parameters.TryGetValue(type, out pb))
             return FallbackValue;
         return pb[index];
     }
     set {
         Parameters.ParameterBase pb;
         if (!_Parameters.TryGetValue(type, out pb))
             throw new NotSupportedException();
         pb[index] = value;
     }
 }
        public bool Compare(EvaluationParameters parameters, DecodeExpressionType comparisonType, INode left, INode right)
        {
            var evalLeft = left.TryEvaluate(parameters);
            var evalRight = right.TryEvaluate(parameters);

            switch (comparisonType) {
                case DecodeExpressionType.GreaterThanOrEqualTo: {
                        var iLeft = ToInteger(evalLeft);
                        var iRight = ToInteger(evalRight);
                        return iLeft >= iRight;
                    }
                case DecodeExpressionType.LessThanOrEqualTo: {
                        var iLeft = ToInteger(evalLeft);
                        var iRight = ToInteger(evalRight);
                        return iLeft <= iRight;
                    }
                case DecodeExpressionType.Equal:
                    return ExpressionsEqual(evalLeft, evalRight);
                case DecodeExpressionType.NotEqual:
                    return !ExpressionsEqual(evalLeft, evalRight);
                default:
                    throw new NotSupportedException();
            }
        }
Example #10
0
 public Comparison(DecodeExpressionType comparisonType, INode left, INode right)
 {
     _ComparisonType = comparisonType;
     _Left = left;
     _Right = right;
 }