Exemple #1
0
        public static void Run(string funcName)
        {
            Func func = GetFunc(funcName);

            if (func != null)
            {
                _isRunning   = true;
                _code.pos    = func.location;
                _currentFunc = func;

                int           opcode       = 0;
                Block         currentBlock = null;
                Stack <Block> block_stack  = new Stack <Block>();

                while (_isRunning)
                {
                    try
                    {
                        opcode = _code.ReadInt();
                    }
                    catch
                    {
                    }

                    if (opcode == Opcodes.pushInt)
                    {
                        _stack.Push(_code.ReadInt());
                    }
                    else if (opcode == Opcodes.pushString)
                    {
                        _stack.Push(_code.ReadString());
                    }
                    else if (opcode == Opcodes.pushVar)
                    {
                        _stack.Push(GetVarValue(_code.ReadString()));
                    }
                    else if (opcode == Opcodes.pop)
                    {
                        _stack.Pop();
                    }
                    else if (opcode == Opcodes.popa)
                    {
                        _stack.Clear();
                    }
                    else if (opcode == Opcodes.decVar)
                    {
                        _vars.Add(new Var(_code.ReadString()));
                    }
                    else if (opcode == Opcodes.setVar)
                    {
                        SetVarValue(_code.ReadString(), _stack.Pop());
                    }
                    else if (opcode == Opcodes.add)
                    {
                        object value1 = _stack.Pop();
                        object value2 = _stack.Pop();

                        if (value1 is string && value2 is string)
                        {
                            string value = ((string)value2) + ((string)value1);
                            _stack.Push(value);
                        }
                        else if (value1 is int && value2 is int)
                        {
                            int value = ((int)value1) + ((int)value2);
                            _stack.Push(value);
                        }
                    }
                    else if (opcode == Opcodes.sub)
                    {
                        int value1 = (int)_stack.Pop();
                        int value2 = (int)_stack.Pop();
                        _stack.Push(value2 - value1);
                    }
                    else if (opcode == Opcodes.mul)
                    {
                        int value1 = (int)_stack.Pop();
                        int value2 = (int)_stack.Pop();
                        _stack.Push(value1 * value2);
                    }
                    else if (opcode == Opcodes.div)
                    {
                        int value1 = (int)_stack.Pop();
                        int value2 = (int)_stack.Pop();
                        _stack.Push(value1 / value2);
                    }
                    else if (opcode == Opcodes.clear)
                    {
                        Console.Clear();
                    }
                    else if (opcode == Opcodes.ife)
                    {
                        int     blockNumber = _code.ReadInt();
                        IfBlock ifblock     = GetIf(blockNumber);

                        object value1 = _stack.Pop();
                        object value2 = _stack.Pop();

                        if (IfEqual(value2, value1))
                        {
                            if (currentBlock == null)
                            {
                                currentBlock = ifblock;
                            }
                            else
                            {
                                block_stack.Push(currentBlock);
                                currentBlock = ifblock;
                            }

                            IncVars();
                            _ifWorked = true;
                        }
                        else
                        {
                            _code.pos = ifblock.endBlock;
                            _ifWorked = false;
                        }
                    }
                    else if (opcode == Opcodes.ifn)
                    {
                        int     blockNumber = _code.ReadInt();
                        IfBlock ifblock     = GetIf(blockNumber);

                        object value1 = _stack.Pop();
                        object value2 = _stack.Pop();

                        if (!IfEqual(value2, value1))
                        {
                            if (currentBlock == null)
                            {
                                currentBlock = ifblock;
                            }
                            else
                            {
                                block_stack.Push(currentBlock);
                                currentBlock = ifblock;
                            }

                            IncVars();
                            _ifWorked = true;
                        }
                        else
                        {
                            _code.pos = ifblock.endBlock;
                            _ifWorked = false;
                        }
                    }
                    else if (opcode == Opcodes.ifgt)
                    {
                        int     blockNumber = _code.ReadInt();
                        IfBlock ifblock     = GetIf(blockNumber);

                        object value1 = _stack.Pop();
                        object value2 = _stack.Pop();

                        if (IfGreater(value2, value1))
                        {
                            if (currentBlock == null)
                            {
                                currentBlock = ifblock;
                            }
                            else
                            {
                                block_stack.Push(currentBlock);
                                currentBlock = ifblock;
                            }

                            IncVars();
                            _ifWorked = true;
                        }
                        else
                        {
                            _code.pos = ifblock.endBlock;
                            _ifWorked = false;
                        }
                    }
                    else if (opcode == Opcodes.ifgte)
                    {
                        int     blockNumber = _code.ReadInt();
                        IfBlock ifblock     = GetIf(blockNumber);

                        object value1 = _stack.Pop();
                        object value2 = _stack.Pop();

                        if (IfGreater(value2, value1) || IfEqual(value2, value1))
                        {
                            if (currentBlock == null)
                            {
                                currentBlock = ifblock;
                            }
                            else
                            {
                                block_stack.Push(currentBlock);
                                currentBlock = ifblock;
                            }

                            IncVars();
                            _ifWorked = true;
                        }
                        else
                        {
                            _code.pos = ifblock.endBlock;
                            _ifWorked = false;
                        }
                    }
                    else if (opcode == Opcodes.iflt)
                    {
                        int     blockNumber = _code.ReadInt();
                        IfBlock ifblock     = GetIf(blockNumber);

                        object value1 = _stack.Pop();
                        object value2 = _stack.Pop();

                        if (IfLesser(value2, value1))
                        {
                            if (currentBlock == null)
                            {
                                currentBlock = ifblock;
                            }
                            else
                            {
                                block_stack.Push(currentBlock);
                                currentBlock = ifblock;
                            }

                            IncVars();
                            _ifWorked = true;
                        }
                        else
                        {
                            _code.pos = ifblock.endBlock;
                            _ifWorked = false;
                        }
                    }
                    else if (opcode == Opcodes.iflte)
                    {
                        int     blockNumber = _code.ReadInt();
                        IfBlock ifblock     = GetIf(blockNumber);

                        object value1 = _stack.Pop();
                        object value2 = _stack.Pop();

                        if (IfLesser(value2, value1) || IfEqual(value2, value1))
                        {
                            if (currentBlock == null)
                            {
                                currentBlock = ifblock;
                            }
                            else
                            {
                                block_stack.Push(currentBlock);
                                currentBlock = ifblock;
                            }

                            IncVars();
                            _ifWorked = true;
                        }
                        else
                        {
                            _code.pos = ifblock.endBlock;
                            _ifWorked = false;
                        }
                    }
                    else if (opcode == Opcodes.elseife)
                    {
                        int         blockNumber = _code.ReadInt();
                        ElseIfBlock elseifblock = GetElseIf(blockNumber);

                        if (!_ifWorked)
                        {
                            object value1 = _stack.Pop();
                            object value2 = _stack.Pop();

                            if (IfEqual(value2, value1))
                            {
                                if (currentBlock == null)
                                {
                                    currentBlock = elseifblock;
                                }
                                else
                                {
                                    block_stack.Push(currentBlock);
                                    currentBlock = elseifblock;
                                }

                                IncVars();
                                _ifWorked = true;
                            }
                            else
                            {
                                _code.pos = elseifblock.endBlock;
                                _ifWorked = false;
                            }
                        }
                        else
                        {
                            _code.pos = elseifblock.endBlock;
                        }
                    }
                    else if (opcode == Opcodes.elseifn)
                    {
                        int         blockNumber = _code.ReadInt();
                        ElseIfBlock elseifblock = GetElseIf(blockNumber);

                        if (!_ifWorked)
                        {
                            object value1 = _stack.Pop();
                            object value2 = _stack.Pop();

                            if (!IfEqual(value2, value1))
                            {
                                if (currentBlock == null)
                                {
                                    currentBlock = elseifblock;
                                }
                                else
                                {
                                    block_stack.Push(currentBlock);
                                    currentBlock = elseifblock;
                                }

                                IncVars();
                                _ifWorked = true;
                            }
                            else
                            {
                                _code.pos = elseifblock.endBlock;
                                _ifWorked = false;
                            }
                        }
                        else
                        {
                            _code.pos = elseifblock.endBlock;
                        }
                    }
                    else if (opcode == Opcodes.elseifgt)
                    {
                        int         blockNumber = _code.ReadInt();
                        ElseIfBlock elseifblock = GetElseIf(blockNumber);

                        if (!_ifWorked)
                        {
                            object value1 = _stack.Pop();
                            object value2 = _stack.Pop();

                            if (IfGreater(value2, value1))
                            {
                                if (currentBlock == null)
                                {
                                    currentBlock = elseifblock;
                                }
                                else
                                {
                                    block_stack.Push(currentBlock);
                                    currentBlock = elseifblock;
                                }

                                IncVars();
                                _ifWorked = true;
                            }
                            else
                            {
                                _code.pos = elseifblock.endBlock;
                                _ifWorked = false;
                            }
                        }
                        else
                        {
                            _code.pos = elseifblock.endBlock;
                        }
                    }
                    else if (opcode == Opcodes.elseifgte)
                    {
                        int         blockNumber = _code.ReadInt();
                        ElseIfBlock elseifblock = GetElseIf(blockNumber);

                        if (!_ifWorked)
                        {
                            object value1 = _stack.Pop();
                            object value2 = _stack.Pop();

                            if (IfGreater(value2, value1) || IfEqual(value2, value1))
                            {
                                if (currentBlock == null)
                                {
                                    currentBlock = elseifblock;
                                }
                                else
                                {
                                    block_stack.Push(currentBlock);
                                    currentBlock = elseifblock;
                                }

                                IncVars();
                                _ifWorked = true;
                            }
                            else
                            {
                                _code.pos = elseifblock.endBlock;
                                _ifWorked = false;
                            }
                        }
                        else
                        {
                            _code.pos = elseifblock.endBlock;
                        }
                    }
                    else if (opcode == Opcodes.elseiflt)
                    {
                        int         blockNumber = _code.ReadInt();
                        ElseIfBlock elseifblock = GetElseIf(blockNumber);

                        if (!_ifWorked)
                        {
                            object value1 = _stack.Pop();
                            object value2 = _stack.Pop();

                            if (IfLesser(value2, value1))
                            {
                                if (currentBlock == null)
                                {
                                    currentBlock = elseifblock;
                                }
                                else
                                {
                                    block_stack.Push(currentBlock);
                                    currentBlock = elseifblock;
                                }

                                IncVars();
                                _ifWorked = true;
                            }
                            else
                            {
                                _code.pos = elseifblock.endBlock;
                                _ifWorked = false;
                            }
                        }
                        else
                        {
                            _code.pos = elseifblock.endBlock;
                        }
                    }
                    else if (opcode == Opcodes.elseiflte)
                    {
                        int         blockNumber = _code.ReadInt();
                        ElseIfBlock elseifblock = GetElseIf(blockNumber);

                        if (!_ifWorked)
                        {
                            object value1 = _stack.Pop();
                            object value2 = _stack.Pop();

                            if (IfLesser(value2, value1) || IfEqual(value2, value1))
                            {
                                if (currentBlock == null)
                                {
                                    currentBlock = elseifblock;
                                }
                                else
                                {
                                    block_stack.Push(currentBlock);
                                    currentBlock = elseifblock;
                                }

                                IncVars();
                                _ifWorked = true;
                            }
                            else
                            {
                                _code.pos = elseifblock.endBlock;
                                _ifWorked = false;
                            }
                        }
                        else
                        {
                            _code.pos = elseifblock.endBlock;
                        }
                    }
                    else if (opcode == Opcodes.els)
                    {
                        int       blockNumber = _code.ReadInt();
                        ElseBlock elseblock   = GetElse(blockNumber);

                        if (!_ifWorked)
                        {
                            if (currentBlock == null)
                            {
                                currentBlock = elseblock;
                            }
                            else
                            {
                                block_stack.Push(currentBlock);
                                currentBlock = elseblock;
                            }

                            IncVars();
                        }
                        else
                        {
                            _code.pos = elseblock.endBlock;
                        }
                    }
                    else if (opcode == Opcodes.endif)
                    {
                        if (block_stack.Count > 0)
                        {
                            currentBlock = block_stack.Pop();
                        }
                        else
                        {
                            currentBlock = null;
                        }

                        DecVars();
                    }
                    else if (opcode == Opcodes.call)
                    {
                        string name = _code.ReadString();
                        Func   f    = GetFunc(name);
                        Call   c    = new Call(_currentFunc, _code.pos, new List <Var>(_vars));
                        _callstack.Push(c);
                        _currentFunc = f;
                        _code.pos    = f.location;
                        _vars.Clear();
                    }
                    else if (opcode == Opcodes.got)
                    {
                        string name     = _code.ReadString();
                        int    location = GetLabel(name);
                        _code.pos = location;
                    }
                    else if (opcode == Opcodes.ret)
                    {
                        if (_callstack.Count > 0)
                        {
                            Call c = _callstack.Pop();
                            _currentFunc = c.func;
                            _code.pos    = c.ret;
                            _vars        = c.vars;
                        }
                        else
                        {
                            _isRunning = false;
                        }
                    }
                    else if (opcode == Opcodes.print)
                    {
                        Console.WriteLine(_stack.Pop());
                    }
                    else if (opcode == Opcodes.printLine)
                    {
                        Console.WriteLine(_stack.Pop());
                    }
                    else if (opcode == Opcodes.read)
                    {
                        Console.Read();
                    }
                    else if (opcode == Opcodes.readLine)
                    {
                        Console.ReadLine();
                    }
                    else if (opcode == Opcodes.inputInt32)
                    {
                        _stack.Push(Convert.ToInt32(Console.ReadLine()));
                    }
                    else if (opcode == Opcodes.inputString)
                    {
                        _stack.Push(Console.ReadLine());
                    }
                    else if (opcode == Opcodes.delay)
                    {
                        System.Threading.Thread.Sleep(Convert.ToInt32(_stack.Pop()));
                    }
                    else if (opcode == Opcodes.captureScreen)
                    {
                        string value = _stack.Pop().ToString();

                        if (value.Equals(""))
                        {
                            value = Guid.NewGuid().ToString();
                        }

                        Screenshot.CaptureAndOpen($"{value}.jpg", ImageFormat.Jpeg);
                    }
                    else if (opcode == Opcodes.getClipboard)
                    {
                        _stack.Push(Clipboard.GetText());
                    }
                    else if (opcode == Opcodes.setClipboard)
                    {
                        Clipboard.SetText(_stack.Pop().ToString());
                    }
                    else if (opcode == Opcodes.write)
                    {
                        _inputSimulator.Keyboard.TextEntry(_stack.Pop().ToString());
                    }
                    else if (opcode == Opcodes.msg)
                    {
                        string value = _stack.Pop().ToString();

                        MessageBox.Show(value);
                    }
                    else if (opcode == Opcodes.exit)
                    {
                        Environment.Exit(0);
                        Application.Exit();
                    }
                }
            }
            else
            {
                if (!funcName.Equals("Main"))
                {
                    throw new Exception($"No function named {funcName} was found");
                }
            }
        }