00001 #ifndef _CODETOOL_H 00002 #define _CODETOOL_H 00003 00004 #include <string> 00005 #include <map> 00006 #include "RobotXMLFile.h" 00007 00008 class Robot; 00009 00010 00011 typedef std::vector<long> stack_v; 00012 00013 00014 class CodeTool 00015 { 00016 public: 00017 CodeTool(RobotXMLFile& ref); 00018 ~CodeTool(); 00019 void SetRobot(Robot *x) { m_robot = x; } 00020 bool Sane(); 00021 void Call(const std::string& method); 00022 00023 int GetOpsize(unsigned char op) { return m_opsize[op]; } 00024 const std::string& GetOpcode(unsigned char op) { return m_opcode[op]; } 00025 unsigned char GetCode(int ptr) { return (ptr >= 0 && ptr < (int)m_codesize) ? m_code[ptr] : 0; } 00026 size_t GetCodesize() { return m_codesize; } 00027 const unsigned char *GetBuf() { return m_code; } 00028 00029 // code runner 00030 unsigned char Execute(); 00031 void Jump(short); 00032 long get_property(int,int); 00033 void set_property(int,int,long); 00034 long call_method(int,int); 00035 00036 private: 00037 RobotXMLFile& m_config; 00038 Robot *m_robot; 00039 size_t m_codesize; 00040 unsigned char *m_code; 00041 std::map<std::string,int> m_methodmap; 00042 std::string m_opcode[256]; 00043 int m_opsize[256]; 00044 std::vector<VARIABLE *> m_variables; 00045 00046 // code runner 00047 size_t m_ptr; // current code ptr 00048 long m_register1; 00049 long m_register2; 00050 stack_v m_stack; 00051 std::vector<MapObject *> * m_loop; 00052 std::vector<MapObject *>::iterator m_loop_iterator; 00053 bool m_loop_init; 00054 }; 00055 00056 00057 00058 00059 #endif // _CODETOOL_H