1 /* 2 * This file is part of HexEditor plugin for Code::Blocks Studio 3 * Copyright (C) 2008-2009 Bartlomiej Swiecki 4 * 5 * HexEditor plugin is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * HexEditor pluging is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with HexEditor. If not, see <http://www.gnu.org/licenses/>. 17 * 18 * $Revision: 7109 $ 19 * $Id: ExpressionExecutor.h 7109 2011-04-15 11:53:16Z mortenmacfly $ 20 * $HeadURL: svn://svn.code.sf.net/p/codeblocks/code/branches/release-20.xx/src/plugins/contrib/HexEditor/ExpressionExecutor.h $ 21 */ 22 23 #ifndef EXPRESSIONEXECUTOR_H 24 #define EXPRESSIONEXECUTOR_H 25 26 #include "FileContentBase.h" 27 #include "ExpressionPreprocessed.h" 28 29 namespace Expression 30 { 31 32 /** \brief Executor of preprocessed expression */ 33 class Executor 34 { 35 public: 36 37 /** \brief Ctor */ 38 Executor(); 39 40 /** \brief Dctor */ 41 ~Executor(); 42 43 /** \brief Execute code */ Execute(const Preprocessed & code,FileContentBase * content,FileContentBase::OffsetT current)44 inline bool Execute( const Preprocessed& code, FileContentBase* content, FileContentBase::OffsetT current ) 45 { 46 m_Code = &code; 47 m_Content = content; 48 m_Current = current; 49 return Run(); 50 } 51 52 /** \brief Get error description */ 53 wxString ErrorDesc(); 54 55 bool GetResult( unsigned long long& val ); 56 bool GetResult( long long& val ); 57 bool GetResult( long double& val ); 58 Value GetResult(); 59 60 private: 61 62 bool Run(); 63 inline void ExecuteOneOp(); 64 65 inline Value& GetStack( int pos = 0 ) 66 { 67 if ( (unsigned) pos >= m_Stack.size() ) throw errorStackIndex; 68 69 return m_Stack[ m_Stack.size() - pos - 1 ]; 70 } 71 PopStack()72 inline void PopStack( ) 73 { 74 if ( m_Stack.empty() ) throw errorStackIndex; 75 m_Stack.pop_back(); 76 } 77 PushStack(const Value & v)78 inline void PushStack( const Value& v ) 79 { 80 m_Stack.push_back( v ); 81 } 82 83 inline void ReplaceStack( const Value& v, int pos = 0 ) 84 { 85 if ( (unsigned) pos >= m_Stack.size() ) throw errorStackIndex; 86 m_Stack[ m_Stack.size() - pos - 1 ] = v; 87 } 88 Content(long long address)89 template< typename T > Value Content( long long address ) 90 { 91 T val; 92 if ( m_Content->Read( &val, address, sizeof(T) ) != sizeof(T) ) 93 { 94 throw errorContentIndex; 95 } 96 return Value( val ); 97 } 98 99 inline void PushArgument( const Operation& op, long long address ); 100 101 inline void PushAddress( const Operation& op, long long address ); 102 103 template< template<typename> class T > 104 inline void BinaryOp( const Operation& op ); 105 106 template< template<typename> class T > 107 inline void UnaryOp( const Operation& op ); 108 109 template< template<typename,typename> class T > 110 inline void UnaryOp2( const Operation& op ); 111 112 template< template<typename,typename> class T1, typename T2 > 113 inline void UnaryOp2Helper( const Operation& op, T2 value ); 114 115 std::vector< Value > m_Stack; 116 const Preprocessed* m_Code; 117 int m_OperationPos; 118 FileContentBase* m_Content; 119 FileContentBase::OffsetT m_Current; 120 executionError m_Status; 121 122 }; 123 } 124 125 #endif 126