#ifndef _SQ_DBGSERVER_H_ #define _SQ_DBGSERVER_H_ #define MAX_BP_PATH 512 #define MAX_MSG_LEN 2049 #if defined( _PS3 ) || defined( POSIX ) #include #include #include #include #include #include "tier0/threadtools.h" typedef int SOCKET; #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #endif // Parts of squirrel do a #define of type, which leads to compile warnings/errors when STL files are included. // -- at least in VS 2013. Luckily we can temporarily #undef it and avoid the problem. // VALVE BUILD #undef type #include #include #include // Redefine type #define type SQ_TYPE /* see copyright notice in sqrdbg.h */ #if !defined( _X360 ) && !defined( _PS3 ) && !defined( POSIX ) #include #endif typedef std::basic_string SQDBGString; inline bool dbg_less(const SQChar *x,const SQChar *y) { int n = 0; do { int xl = *x == '\\' ? '/' : tolower(*x); int yl = *y == '\\' ? '/' : tolower(*y); int diff = xl - yl; if(diff != 0) return diff > 0?true:false; x++; y++; }while(*x != 0 && *y != 0); return false; } struct BreakPoint{ BreakPoint(){_line=0;} BreakPoint(int line, const SQChar *src){ _line = line; _src = src; } BreakPoint(const BreakPoint& bp){ _line = bp._line; _src=bp._src; } inline bool operator<(const BreakPoint& bp) const { if(_line BreakPointSet; typedef BreakPointSet::iterator BreakPointSetItor; typedef std::set WatchSet; typedef WatchSet::iterator WatchSetItor; typedef std::vector SQCharVec; struct SQDbgServer{ public: enum eDbgState{ eDBG_Running, eDBG_StepOver, eDBG_StepInto, eDBG_StepReturn, eDBG_Suspended, eDBG_Disabled, }; SQDbgServer(HSQUIRRELVM v); ~SQDbgServer(); bool Init(); bool IsConnected(); //returns true if a message has been received bool WaitForClient(); bool ReadMsg(); void BusyWait(); void Hook(int type,int line,const SQChar *src,const SQChar *func); void ParseMsg(const char *msg); bool ParseBreakpoint(const char *msg,BreakPoint &out); bool ParseWatch(const char *msg,Watch &out); bool ParseRemoveWatch(const char *msg,int &id); void Terminated(); // void BreakExecution(); void Send(const SQChar *s,...); void SendChunk(const SQChar *chunk); void Break(int line,const SQChar *src,const SQChar *type,const SQChar *error=NULL); void SerializeState(); //COMMANDS void AddBreakpoint(BreakPoint &bp); void AddWatch(Watch &w); void RemoveWatch(int id); void RemoveBreakpoint(BreakPoint &bp); // void SetErrorHandlers(); //XML RELATED STUFF/////////////////////// #define MAX_NESTING 10 struct XMLElementState { SQChar name[256]; bool haschildren; }; XMLElementState xmlstate[MAX_NESTING]; int _xmlcurrentement; void BeginDocument() { _xmlcurrentement = -1; } void BeginElement(const SQChar *name); void Attribute(const SQChar *name, const SQChar *value); void EndElement(const SQChar *name); void EndDocument(); const SQChar *escape_xml(const SQChar *x); ////////////////////////////////////////////// HSQUIRRELVM _v; HSQOBJECT _debugroot; eDbgState _state; SOCKET _accept; SOCKET _endpoint; BreakPointSet _breakpoints; WatchSet _watches; int _recursionlevel; int _maxrecursion; int _nestedcalls; bool _ready; bool _autoupdate; HSQOBJECT _serializefunc; SQCharVec _scratchstring; }; #ifdef _WIN32 #define sqdbg_closesocket(x) closesocket((x)) #else #define sqdbg_closesocket(x) close((x)) #endif #endif //_SQ_DBGSERVER_H_