Exemplo n.º 1
0
        public static VarList Event(VarList globals)
        {
            VarList outp = new VarList();
            Dictionary <string, Var> evnt = outp.string_vars;

            evnt["_call"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                VarEvent ths     = (VarEvent)arguments.number_vars[0];
                int i            = 0;
                State state      = new State();
                state.returns[0] = Var.nil;
                DoLater toDo     = null;
                toDo             = new DoLater(delegate {
                    if (i >= ths.callbacks.Count)
                    {
                        return;
                    }
                    scope.callstack.Push(toDo);
                    VarList newArgs = new VarList();
                    foreach (KeyValuePair <Var, Var> kv in arguments)
                    {
                        if (kv.Key is VarNumber)
                        {
                            double k = (double)(VarNumber)kv.Key;
                            if (k >= 0 && k % 1 == 0)
                            {
                                if (k > 0)
                                {
                                    newArgs.number_vars[k - 1] = kv.Value;
                                }
                            }
                            else
                            {
                                newArgs.number_vars[k] = kv.Value;
                            }
                        }
                        else if (kv.Key is VarString)
                        {
                            newArgs.string_vars[(string)(VarString)kv.Key] = kv.Value;
                        }
                        else
                        {
                            newArgs.other_vars[kv.Key] = kv.Value;
                        }
                    }

                    ths.callbacks[i].Call(scope, state.returns, 0, newArgs);
                    i++;
                });
                scope.callstack.Push(toDo);
            });

            evnt["_and"] = And;
            evnt["_or"]  = Or;

            evnt["_tostring"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                returnTarget[returnID] = "<Event>";
            });
            return(outp);
        }
Exemplo n.º 2
0
        public static VarList Generate()
        {
            globals = new VarList();
            globals.string_vars["print"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                State state          = new State();
                DoLater looping_func = null;
                looping_func         = new DoLater(delegate {
                    foreach (KeyValuePair <double, Var> arg in arguments.number_vars)
                    {
                        if (arg.Key % 1 == 0)
                        {
                            if (!state.returns.ContainsKey((int)arg.Key))
                            {
                                scope.callstack.Push(looping_func);
                                arg.Value.ToString(scope, state.returns, (int)arg.Key);
                                return;
                            }
                        }
                    }
                    string Output = "";
                    string joiner = "";
                    foreach (KeyValuePair <double, Var> arg in arguments.number_vars)
                    {
                        if (arg.Key % 1 == 0)
                        {
                            if (state.returns[(int)arg.Key] is VarString)
                            {
                                Output += joiner;
                                Output += ((VarString)state.returns[(int)arg.Key]).data;
                                joiner  = "\t";
                            }
                        }
                    }
                    scope.program.terminal.Write(Output + "\r\n");
                    returnTarget[returnID] = Output;
                });
                scope.callstack.Push(looping_func);
            });
            globals.string_vars["write"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                State state          = new State();
                DoLater looping_func = null;
                looping_func         = new DoLater(delegate {
                    foreach (KeyValuePair <double, Var> arg in arguments.number_vars)
                    {
                        if (arg.Key % 1 == 0)
                        {
                            if (!state.returns.ContainsKey((int)arg.Key))
                            {
                                scope.callstack.Push(looping_func);
                                arg.Value.ToString(scope, state.returns, (int)arg.Key);
                                return;
                            }
                        }
                    }
                    string Output = "";
                    string joiner = "";
                    foreach (KeyValuePair <double, Var> arg in arguments.number_vars)
                    {
                        if (arg.Key % 1 == 0)
                        {
                            if (state.returns[(int)arg.Key] is VarString)
                            {
                                Output += joiner;
                                Output += ((VarString)state.returns[(int)arg.Key]).data;
                                joiner  = "\t";
                            }
                        }
                    }
                    scope.program.terminal.Write(Output);
                    returnTarget[returnID] = Output;
                });
                scope.callstack.Push(looping_func);
            });
            globals.string_vars["event"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                returnTarget[returnID] = new VarEvent();
            });
            globals.string_vars["type"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                returnTarget[returnID] = arguments.number_vars[0].type;
            });

            globals.string_vars["table"]  = LibTable.Generate(globals);
            globals.string_vars["term"]   = LibTerm.Generate(globals);
            globals.string_vars["string"] = LibString.Generate(globals);
            globals.string_vars["math"]   = LibMath.Generate(globals);
            globals.string_vars["tcomm"]  = LibTComm.Generate(globals);
            globals.string_vars["net"]    = LibNet.Generate(globals);

            globals.string_vars["tostring"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                arguments.number_vars[0].ToString(scope, returnTarget, returnID);
            });

            globals.string_vars["tonumber"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                arguments.number_vars[0].ToNumber(scope, returnTarget, returnID);
            });

            return(globals);
        }
Exemplo n.º 3
0
        public static VarList Generate(VarList globals)
        {
            VarList string_VAR           = new VarList();
            Dictionary <string, Var> str = string_VAR.string_vars;

            str["sub"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                if (arguments.number_vars.ContainsKey(2))
                {
                    returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).Substring((int)(VarNumber)arguments.number_vars[1], (int)(VarNumber)arguments.number_vars[2]);
                }
                else
                {
                    returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).Substring((int)(VarNumber)arguments.number_vars[1]);
                }
            });

            str["match"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString)
                {
                    string haystack = (string)(VarString)arguments.number_vars[0];
                    string needle   = (string)(VarString)arguments.number_vars[1];
                    Regex matcher   = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1));
                    try{
                        Match m = matcher.Match(haystack);
                        if (m.Success)
                        {
                            if (m.Groups.Count == 1)
                            {
                                returnTarget[returnID] = m.Groups[0].Value;
                            }
                            else
                            {
                                VarList outList = new VarList();
                                for (int i = 0; i < m.Groups.Count; i++)
                                {
                                    outList.string_vars[m.Groups[i].Name] = outList.number_vars[i] = m.Groups[i].Value;
                                }
                                returnTarget[returnID] = outList;
                            }
                        }
                    }catch {}
                }
            });

            str["gmatch"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString)
                {
                    string haystack = (string)(VarString)arguments.number_vars[0];
                    string needle   = (string)(VarString)arguments.number_vars[1];
                    Regex matcher   = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1));
                    try{
                        MatchCollection M      = matcher.Matches(haystack);
                        int i                  = 0;
                        returnTarget[returnID] = new VarFunction(delegate(Scope nscope, Dictionary <int, Var> nreturnTarget, int nreturnID, VarList narguments){
                            if (i < M.Count)
                            {
                                Match m = M[i];
                                if (m.Groups.Count == 1)
                                {
                                    nreturnTarget[nreturnID] = m.Groups[0].Value;
                                }
                                else
                                {
                                    VarList outList = new VarList();
                                    for (int c = 0; c < m.Groups.Count; c++)
                                    {
                                        outList.string_vars[m.Groups[c].Name] = outList.number_vars[c] = m.Groups[c].Value;
                                    }
                                    nreturnTarget[nreturnID] = outList;
                                }
                            }
                            else
                            {
                                nreturnTarget[nreturnID] = Var.nil;
                            }
                            i++;
                        });
                    }catch {}
                }
            });

            str["gsub"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString && arguments.number_vars.ContainsKey(2) && arguments.number_vars[2] is VarString)
                {
                    string haystack = (string)(VarString)arguments.number_vars[0];
                    string needle   = (string)(VarString)arguments.number_vars[1];
                    Regex matcher   = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1));
                    try{
                        returnTarget[returnID] = matcher.Replace(haystack, (string)(VarString)arguments.number_vars[2]);
                    }catch {}
                }
                else if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString && arguments.number_vars.ContainsKey(2) && arguments.number_vars[2] is VarFunction)
                {
                    string haystack          = (string)(VarString)arguments.number_vars[0];
                    string needle            = (string)(VarString)arguments.number_vars[1];
                    VarFunction replace_func = (VarFunction)arguments.number_vars[2];
                    Regex matcher            = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1));
                    try{
                        MatchCollection M = matcher.Matches(haystack);
                        string built      = "";
                        int lastIndex     = 0;
                        int i             = 0;
                        DoLater loopfnc   = null;
                        State s_state     = new State();
                        loopfnc           = new DoLater(delegate {
                            if (i < M.Count)
                            {
                                scope.callstack.Push(loopfnc);
                                Match m = M[i];
                                if (i > 0)
                                {
                                    if (s_state.returns[0] is VarString)
                                    {
                                        built += (string)(VarString)s_state.returns[0];
                                    }
                                }
                                built    += haystack.Substring(lastIndex, m.Index - lastIndex);
                                lastIndex = m.Index + m.Groups[0].Length;
                                if (m.Groups.Count == 1)
                                {
                                    replace_func.Call(scope, s_state.returns, 0, m.Groups[0].Value);
                                }
                                else
                                {
                                    VarList outList = new VarList();
                                    for (int c = 0; c < m.Groups.Count; c++)
                                    {
                                        outList.string_vars[m.Groups[c].Name] = outList.number_vars[c] = m.Groups[c].Value;
                                    }
                                    replace_func.Call(scope, s_state.returns, 0, outList);
                                }
                                i++;
                            }
                            else
                            {
                                if (i > 0)
                                {
                                    if (s_state.returns[0] is VarString)
                                    {
                                        built += (string)(VarString)s_state.returns[0];
                                    }
                                }
                                built += haystack.Substring(lastIndex, haystack.Length - lastIndex);
                                returnTarget[returnID] = built;
                            }
                        });
                        scope.callstack.Push(loopfnc);
                    }catch {}
                }
            });

            str["upper"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString)
                {
                    returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).ToUpper();
                }
            });
            str["lower"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString)
                {
                    returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).ToLower();
                }
            });
            str["reverse"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){
                if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString)
                {
                    char[] arr = ((string)(VarString)arguments.number_vars[0]).ToCharArray();
                    System.Array.Reverse(arr);
                    returnTarget[returnID] = new string(arr);
                }
            });

            return(string_VAR);
        }