Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
Datei: List.cs Projekt: 7474/SRC
        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);
            }
        }
Beispiel #8
0
        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);
            }
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
Datei: Call.cs Projekt: 7474/SRC
        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);
        }