protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { str_result = ""; num_result = 0d; var buf = SRC.Expression.GetValueAsString(@params[1], is_term[1]); switch (pcount) { case 3: { var i = SRC.Expression.GetValueAsLong(@params[2], is_term[2]); var j = SRC.Expression.GetValueAsLong(@params[3], is_term[3]); str_result = Strings.Mid(buf, i, j); break; } case 2: { var i = SRC.Expression.GetValueAsLong(@params[2], is_term[2]); str_result = Strings.Mid(buf, i); break; } } if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); return(ValueType.NumericType); } else { return(ValueType.StringType); } }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { num_result = 0d; str_result = Strings.Right(SRC.Expression.GetValueAsString(@params[1], is_term[1]), SRC.Expression.GetValueAsLong(@params[2], is_term[2])); if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); return(ValueType.NumericType); } else { return(ValueType.StringType); } }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { var CallFunctionRet = ValueType.UndefinedType; str_result = ""; num_result = 0d; // UpVarコマンドの呼び出し回数を累計 var num = SRC.Event.UpVarLevel; var i = SRC.Event.CallDepth; while (num > 0) { i = (i - num); if (i < 1) { i = 1; break; } num = SRC.Event.UpVarLevelStack[i]; } if (i < 1) { i = 1; } // 引数の範囲内に納まっているかチェック num = SRC.Expression.GetValueAsLong(@params[1], is_term[1]); if (num <= SRC.Event.ArgIndex - SRC.Event.ArgIndexStack[i - 1]) { str_result = SRC.Event.ArgStack[SRC.Event.ArgIndex - num + 1]; } if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); CallFunctionRet = ValueType.NumericType; } else { CallFunctionRet = ValueType.StringType; } return(CallFunctionRet); }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { str_result = ""; num_result = 0d; switch (pcount) { case 4: { var buf = SRC.Expression.GetValueAsString(@params[1], is_term[1]); var num = SRC.Expression.GetValueAsLong(@params[4], is_term[4]); var buf2 = Strings.Right(buf, Strings.Len(buf) - num + 1); buf2 = buf2.Replace(SRC.Expression.GetValueAsString(@params[2], is_term[2]), SRC.Expression.GetValueAsString(@params[3], is_term[3])); str_result = Strings.Left(buf, num - 1) + buf2; break; } case 5: { var buf = SRC.Expression.GetValueAsString(@params[1], is_term[1]); var num = SRC.Expression.GetValueAsLong(@params[4], is_term[4]); var num2 = SRC.Expression.GetValueAsLong(@params[5], is_term[5]); var buf2 = Strings.Mid(buf, num, num2); buf2 = buf2.Replace(SRC.Expression.GetValueAsString(@params[2], is_term[2]), SRC.Expression.GetValueAsString(@params[3], is_term[3])); str_result = Strings.Left(buf, num - 1) + buf2 + Strings.Right(buf, Strings.Len(buf) - (num + num2 - 1) - 1); break; } default: { str_result = SRC.Expression.GetValueAsString(@params[1], is_term[1]).Replace( SRC.Expression.GetValueAsString(@params[2], is_term[2]), SRC.Expression.GetValueAsString(@params[3], is_term[3])); break; } } if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); return(ValueType.NumericType); } else { return(ValueType.StringType); } }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { str_result = ""; num_result = 0d; // XXX 元は String -> String フォーマット // XXX 書式は多分合っていないのでヘルプ更新したほうが良いかも str_result = SrcFormatter.Format(SRC.Expression.GetValueAsDouble(@params[1], is_term[1]), SRC.Expression.GetValueAsString(@params[2], is_term[2])); if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); return(ValueType.NumericType); } else { return(ValueType.StringType); } }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { str_result = ""; num_result = 0d; var buf = SRC.Expression.GetValueAsString(@params[2], is_term[2]); var num = SRC.Expression.GetValueAsLong(@params[1], is_term[1]); str_result = string.Join("", Enumerable.Range(0, Math.Max(0, num)).Select(x => buf)); if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); return(ValueType.NumericType); } else { return(ValueType.StringType); } }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { num_result = 0d; str_result = GeneralLib.ListIndex( SRC.Expression.GetValueAsString(@params[1], is_term[1]), SRC.Expression.GetValueAsLong(@params[2], is_term[2])); // 全体が()で囲まれている場合は()を外す if (Strings.Left(str_result, 1) == "(" && Strings.Right(str_result, 1) == ")") { str_result = Strings.Mid(str_result, 2, Strings.Len(str_result) - 2); } if (etype == ValueType.StringType) { return(ValueType.StringType); } else { num_result = GeneralLib.StrToDbl(str_result); return(ValueType.NumericType); } }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { str_result = ""; num_result = 0d; // XXX 元は expr 切り出してたけれどなんでだろ var list = GeneralLib.ToList(@params[1]); var num = list.Count; var flag = false; // XXX このSwitch何を意図したものなのか分からん。。。 switch (num) { case 1: { if (SRC.PList.IsDefined(list[0])) { { var withBlock17 = SRC.PList.Item(list[0]); if (withBlock17.Unit is null) { flag = false; } else { { var withBlock18 = withBlock17.Unit; if (withBlock18.Status == "出撃" || withBlock18.Status == "格納") { flag = true; } else { flag = false; } } } } } else if (SRC.Expression.GetValueAsLong(@params[1]) != 0) { flag = true; } else { flag = false; } break; } case 2: { if (SRC.PList.IsDefined(list[1])) { var withBlock19 = SRC.PList.Item(list[1]); if (withBlock19.Unit is null) { flag = true; } else { { var withBlock20 = withBlock19.Unit; if (withBlock20.Status == "出撃" || withBlock20.Status == "格納") { flag = false; } else { flag = true; } } } } else if (SRC.Expression.GetValueAsLong(@params[1], true) == 0) { flag = true; } else { flag = false; } break; } default: { if (SRC.Expression.GetValueAsLong(@params[1]) != 0) { flag = true; } else { flag = false; } break; } } if (flag) { str_result = SRC.Expression.GetValueAsString(@params[2], is_term[2]); } else { str_result = SRC.Expression.GetValueAsString(@params[3], is_term[3]); } if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); return(ValueType.NumericType); } else { return(ValueType.StringType); } }
protected override int ExecInternal() { bool IsList; if (ArgNum != 4) { throw new EventErrorException(this, "Arrayコマンドの引数の数が違います"); } else if (GetArgAsString(4) == "リスト") { IsList = true; } else { IsList = false; } // 代入先の変数名 var var_name = GetArg(2); if (Strings.Left(var_name, 1) == "$") { var_name = Strings.Mid(var_name, 2); } // Eval関数 if (Strings.LCase(Strings.Left(var_name, 5)) == "eval(") { if (Strings.Right(var_name, 1) == ")") { var_name = Strings.Mid(var_name, 6, Strings.Len(var_name) - 6); var_name = Expression.GetValueAsString(var_name); } } // 代入先の変数を初期化した上で再設定 if (Expression.IsSubLocalVariableDefined(var_name)) { // サブルーチンローカル変数の場合 Expression.UndefineVariable(var_name); Event.VarIndex = (Event.VarIndex + 1); Event.VarStack[Event.VarIndex].Init(var_name); } else if (Expression.IsLocalVariableDefined(var_name)) { // ローカル変数の場合 Expression.UndefineVariable(var_name); Expression.DefineLocalVariable(var_name); } else if (Expression.IsGlobalVariableDefined(var_name)) { // グローバル変数の場合 Expression.UndefineVariable(var_name); Expression.DefineGlobalVariable(var_name); } string[] array_buf; if (IsList) { // リストを配列に変換 GeneralLib.ListSplit(GetArgAsString(3), out array_buf); } else { // 文字列を分割して配列に代入 var buf = GetArgAsString(3); var sep = GetArgAsString(4); array_buf = buf.Split(sep); } for (var i = 1; i <= array_buf.Length; i++) { var buf = array_buf[i - 1].Trim(); Expressions.ValueType etype; string str_value; double num_value; if (Information.IsNumeric(buf)) { etype = Expressions.ValueType.NumericType; str_value = ""; num_value = GeneralLib.StrToDbl(buf); } else { etype = Expressions.ValueType.StringType; str_value = buf; num_value = 0d; } var vname = var_name + "[" + i + "]"; Expression.SetVariable(vname, etype, str_value, num_value); } return(EventData.NextID); }
protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result) { var CallFunctionRet = ValueType.UndefinedType; str_result = ""; num_result = 0d; try { // サブルーチンの場所は? // まずはサブルーチン名が式でないと仮定して検索 var ret = SRC.Event.FindNormalLabel(@params[1]); if (ret < 0) { // 式で指定されている? ret = SRC.Event.FindNormalLabel(SRC.Expression.GetValueAsString(@params[1], is_term[1])); if (ret < 0) { SRC.Event.DisplayEventErrorMessage(SRC.Event.CurrentLineNum, "指定されたサブルーチン「" + @params[1] + "」が見つかりません"); return(CallFunctionRet); } } ret = ret + 1; // 呼び出し階層をチェック if (SRC.Event.CallDepth >= Event.MaxCallDepth) { SRC.Event.CallDepth = Event.MaxCallDepth; SRC.Event.DisplayEventErrorMessage(SRC.Event.CurrentLineNum, Event.MaxCallDepth + "階層を越えるサブルーチンの呼び出しは出来ません"); return(CallFunctionRet); } // 引数用スタックが溢れないかチェック if ((SRC.Event.ArgIndex + pcount) >= Event.MaxArgIndex) { SRC.Event.DisplayEventErrorMessage(SRC.Event.CurrentLineNum, "サブルーチンの引数の総数が" + Event.MaxArgIndex + "個を超えています"); return(CallFunctionRet); } // 引数を評価しておく for (var i = 2; i <= pcount; i++) { @params[i] = SRC.Expression.GetValueAsString(@params[i], is_term[i]); } // 現在の状態を保存 SRC.Event.CallStack[SRC.Event.CallDepth] = SRC.Event.CurrentLineNum; SRC.Event.ArgIndexStack[SRC.Event.CallDepth] = SRC.Event.ArgIndex; SRC.Event.VarIndexStack[SRC.Event.CallDepth] = SRC.Event.VarIndex; SRC.Event.ForIndexStack[SRC.Event.CallDepth] = SRC.Event.ForIndex; // UpVarが実行された場合、UpVar実行数は累計する if (SRC.Event.UpVarLevel > 0) { SRC.Event.UpVarLevelStack[SRC.Event.CallDepth] = (SRC.Event.UpVarLevel + SRC.Event.UpVarLevelStack[SRC.Event.CallDepth - 1]); } else { SRC.Event.UpVarLevelStack[SRC.Event.CallDepth] = 0; } // UpVarの階層数を初期化 SRC.Event.UpVarLevel = 0; // 呼び出し階層数をインクリメント SRC.Event.CallDepth = (SRC.Event.CallDepth + 1); var cur_depth = SRC.Event.CallDepth; // 引数をスタックに積む SRC.Event.ArgIndex = (SRC.Event.ArgIndex + pcount); for (var i = 1; i <= pcount; i++) { SRC.Event.ArgStack[SRC.Event.ArgIndex - i + 1] = @params[i]; } // サブルーチン本体を実行 do { SRC.Event.CurrentLineNum = ret; if (SRC.Event.CurrentLineNum >= SRC.Event.EventCmd.Count) { break; } var cmd = SRC.Event.EventCmd[SRC.Event.CurrentLineNum]; if (cur_depth == SRC.Event.CallDepth && cmd.Name == Events.CmdType.ReturnCmd) { break; } ret = cmd.Exec(); }while (ret >= 0); // 返り値 { var withBlock1 = SRC.Event.EventCmd[SRC.Event.CurrentLineNum]; if (withBlock1.ArgNum == 2) { str_result = withBlock1.GetArgAsString(2); } else { str_result = ""; } } // 呼び出し階層数をデクリメント SRC.Event.CallDepth = (SRC.Event.CallDepth - 1); // サブルーチン実行前の状態に復帰 SRC.Event.CurrentLineNum = SRC.Event.CallStack[SRC.Event.CallDepth]; SRC.Event.ArgIndex = SRC.Event.ArgIndexStack[SRC.Event.CallDepth]; SRC.Event.VarIndex = SRC.Event.VarIndexStack[SRC.Event.CallDepth]; SRC.Event.ForIndex = SRC.Event.ForIndexStack[SRC.Event.CallDepth]; SRC.Event.UpVarLevel = SRC.Event.UpVarLevelStack[SRC.Event.CallDepth]; if (etype == ValueType.NumericType) { num_result = GeneralLib.StrToDbl(str_result); CallFunctionRet = ValueType.NumericType; } else { CallFunctionRet = ValueType.StringType; } } finally { SRC.LogTrace("Called", etype.ToString().Substring(0, 1), @params[1] + "(" + string.Join(",", Enumerable.Range(2, pcount - 1).Select(x => @params[x])) + ")", str_result, num_result.ToString() ); } return(CallFunctionRet); }