示例#1
0
        private static ParseResult VariableSetValueHandler(string VariableType, string VariableName, string VariableValue)
        {
            object    FutureValue = null;
            ETypeInfo FutureType  = GetCompatibleTypeByName(VariableType);

            if (VariableType == "var")
            {
                Variables.SetVariableObject(VariableName, ConvertStringToVar(VariableValue));
                return(new ParseResult(ParseResult.ParserNativeResults.ParserNativeOK, "VariableSetValueHandler, variable is auto"));
            }

            if (FutureType == null)
            {
                throw new Exceptions.ParserException($"Unknown variable type ({VariableName})");
            }

            if (VariableValue.Length == 0)
            {
                // It's something like "bool a;", so the value is null
                FutureValue = null;

                // But what if the variable is non nullable!??!?!?!?!
                // Well, C# should throw an exception, yes?
                Variables.SetVariableObject(VariableName, FutureValue);

                // NICE>
            }
            else
            {
                for (int i = 0; i < Variables.VarList.Count; i++)
                {
                    var var = Variables.VarList[i];
                    if (var.Name == VariableValue)
                    {
                        if (var.Value != null && var.Value.GetType() != FutureType.Type && FutureType.Type != typeof(object))
                        {
                            throw new Exceptions.VariableSetException($"{var.Name}'s type is {var.Value.GetType().Name}, but you are trying to set it to {FutureType.Type.Name}");
                        }

                        FutureValue = var.Value;
                        goto finishWithValue;
                    }
                }

                // Check for values
                if (VariableValue == "null") // it should think like command was: bool a;
                {
                    return(VariableSetValueHandler(VariableType, VariableName, ""));
                }

                FutureValue = ConvertStringToVar(FutureType, VariableValue);

finishWithValue:
                Variables.SetVariableObject(VariableName, FutureValue);
            }

            return(new ParseResult(ParseResult.ParserNativeResults.ParserNativeOK, "VariableSetValueHandler done"));
        }
示例#2
0
        public static object ConvertStringToVar(string str)
        {
            if (str.StartsWith("(")) // it's a cast
            {
                string CastTo    = "";
                string Value     = "";
                bool   IsCastNow = true;
                for (int i = 1; i < str.Length; i++)
                {
                    if (str[i] == ')')
                    {
                        IsCastNow = false;
                        continue;
                    }

                    if (IsCastNow)
                    {
                        CastTo += str[i];
                    }
                    else
                    {
                        Value += str[i];
                    }
                }

                ETypeInfo FutureType = GetCompatibleTypeByName(CastTo);

                if (FutureType == null)
                {
                    throw new Exceptions.ParserException($"Unknown variable type: {CastTo}");
                }

                var castResult = ConvertStringToVar(FutureType, Value);

                if (castResult == null)
                {
                    throw new Exceptions.ParserException($"Can't cast '{Value}' to {CastTo})");
                }
                else
                {
                    return(castResult);
                }
            }

            if (str == "null")
            {
                return(null);
            }

            var var = Variables.Get(str);

            if (var == null || var.GetType() != typeof(VNull))
            {
                return(var);
            }

            if (str.StartsWith("\"") && str.EndsWith("\""))
            {
                // FIX ME: it will remove all " chars even like """"test"""" will become just test
                return(str.Trim(new char[] { '"' }));
            }
            else if (str.StartsWith("'") && str.EndsWith("'"))
            {
                // FIX ME too
                return(str.Trim(new char[] { "'"[0] })[0]);
            }
            else if (str == "false" || str == "true")
            {
                return(bool.Parse(str));
            }
            else if (str.StartsWith("0x") || str.Any(char.IsDigit))
            {
                var r = ConvertStringToNumber(str);
                if (r != null)
                {
                    return(r);
                }
            }
            else
            {
            }

            // well i tried everything but...
            throw new NotImplementedException("Parser can't detect variable's type");
        }
示例#3
0
        public static object ConvertStringToVar(ETypeInfo FutureType, string VariableValue)
        {
            object FutureValue = null;

            if (FutureType.Type == typeof(char))
            {
                VariableValue = VariableValue.Trim(new char[] { "'"[0] });

                FutureValue = VariableValue[0];
            }
            else if (FutureType.Type == typeof(string))
            {
                VariableValue = VariableValue.Trim(new char[] { '"' });

                FutureValue = VariableValue;
            }
            else if (FutureType.Type == typeof(object))
            {
                FutureValue = ConvertStringToVar(VariableValue);
            }
            else if (FutureType.Type == typeof(bool))
            {
                FutureValue = bool.Parse(VariableValue);
            }
            else if (FutureType.Type == typeof(int))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = int.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(long))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = long.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(ulong))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = ulong.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(uint))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = uint.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(ushort))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = ushort.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(float))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = float.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(double))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = double.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(IntPtr))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = (IntPtr)int.Parse(VariableValue, NumberStyle);
            }
            else if (FutureType.Type == typeof(UIntPtr))
            {
                var NumberStyle = System.Globalization.NumberStyles.Any;
                if (VariableValue.StartsWith("0x"))
                {
                    VariableValue = VariableValue.Remove(0, 2);
                    NumberStyle   = System.Globalization.NumberStyles.HexNumber;
                }
                FutureValue = (UIntPtr)uint.Parse(VariableValue, NumberStyle);
            }
            else
            {
                throw new NotImplementedException($"Type {FutureType.Type.Name} is not implemented in ESCRIPT");
            }
            return(FutureValue);
        }