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")); }
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"); }
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); }