1 #include <squirrel.h>
\r
3 #include <squirrel.h>
\r
4 #include <squirrel.h>
\r
6 #include "sqdbgserver.h"
\r
7 SQInteger debug_hook(HSQUIRRELVM v);
\r
8 SQInteger error_handler(HSQUIRRELVM v);
\r
10 #include "serialize_state.inl"
\r
12 HSQREMOTEDBG sq_rdbg_init(HSQUIRRELVM v,unsigned short port,SQBool autoupdate)
\r
15 sockaddr_in bindaddr;
\r
17 if (WSAStartup (MAKEWORD(2,2), &wsadata) != 0){
\r
21 SQDbgServer *rdbg = new SQDbgServer(v);
\r
22 rdbg->_autoupdate = autoupdate?true:false;
\r
23 rdbg->_accept = socket(AF_INET,SOCK_STREAM,0);
\r
24 bindaddr.sin_family = AF_INET;
\r
25 bindaddr.sin_port = htons(port);
\r
26 bindaddr.sin_addr.s_addr = htonl (INADDR_ANY);
\r
27 if(bind(rdbg->_accept,(sockaddr*)&bindaddr,sizeof(bindaddr))==SOCKET_ERROR){
\r
29 sq_throwerror(v,_SC("failed to bind the socket"));
\r
34 sq_throwerror(v,_SC("failed to initialize the debugger"));
\r
41 SQRESULT sq_rdbg_waitforconnections(HSQREMOTEDBG rdbg)
\r
43 if(SQ_FAILED(sq_compilebuffer(rdbg->_v,serialize_state_nut,(SQInteger)scstrlen(serialize_state_nut),_SC("SERIALIZE_STATE"),SQFalse))) {
\r
44 sq_throwerror(rdbg->_v,_SC("error compiling the serialization function"));
\r
46 sq_getstackobj(rdbg->_v,-1,&rdbg->_serializefunc);
\r
47 sq_addref(rdbg->_v,&rdbg->_serializefunc);
\r
50 sockaddr_in cliaddr;
\r
51 int addrlen=sizeof(cliaddr);
\r
52 if(listen(rdbg->_accept,0)==SOCKET_ERROR)
\r
53 return sq_throwerror(rdbg->_v,_SC("error on listen(socket)"));
\r
54 rdbg->_endpoint = accept(rdbg->_accept,(sockaddr*)&cliaddr,&addrlen);
\r
55 //do not accept any other connection
\r
56 sqdbg_closesocket(rdbg->_accept);
\r
57 rdbg->_accept = INVALID_SOCKET;
\r
58 if(rdbg->_endpoint==INVALID_SOCKET){
\r
59 return sq_throwerror(rdbg->_v,_SC("error accept(socket)"));
\r
61 while(!rdbg->_ready){
\r
62 sq_rdbg_update(rdbg);
\r
67 SQRESULT sq_rdbg_update(HSQREMOTEDBG rdbg)
\r
73 FD_ZERO(&read_flags);
\r
74 FD_SET(rdbg->_endpoint, &read_flags);
\r
75 select(NULL/*ignored*/, &read_flags, NULL, NULL, &time);
\r
77 if(FD_ISSET(rdbg->_endpoint,&read_flags)){
\r
81 memset(&temp,0,sizeof(temp));
\r
83 FD_CLR(rdbg->_endpoint, &read_flags);
\r
84 while((res = recv(rdbg->_endpoint,&c,1,0))>0){
\r
92 if(size >= sizeof(temp)-2) break;
\r
97 return sq_throwerror(rdbg->_v,_SC("disconnected"));
\r
99 return sq_throwerror(rdbg->_v,_SC("socket error"));
\r
104 rdbg->ParseMsg(temp);
\r
109 SQInteger debug_hook(HSQUIRRELVM v)
\r
112 SQInteger event_type,line;
\r
113 const SQChar *src,*func;
\r
114 sq_getinteger(v,2,&event_type);
\r
115 sq_getstring(v,3,&src);
\r
116 sq_getinteger(v,4,&line);
\r
117 sq_getstring(v,5,&func);
\r
118 sq_getuserpointer(v,-1,&up);
\r
119 HSQREMOTEDBG rdbg = (HSQREMOTEDBG)up;
\r
120 rdbg->Hook(v,event_type,line,src,func);
\r
121 if(rdbg->_autoupdate) {
\r
122 if(SQ_FAILED(sq_rdbg_update(rdbg)))
\r
123 return sq_throwerror(v,_SC("socket failed"));
\r
128 SQInteger error_handler(HSQUIRRELVM v)
\r
131 const SQChar *sErr=NULL;
\r
132 const SQChar *fn=_SC("unknown");
\r
133 const SQChar *src=_SC("unknown");
\r
136 sq_getuserpointer(v,-1,&up);
\r
137 HSQREMOTEDBG rdbg=(HSQREMOTEDBG)up;
\r
138 if(SQ_SUCCEEDED(sq_stackinfos(v,1,&si)))
\r
140 if(si.funcname)fn=si.funcname;
\r
141 if(si.source)src=si.source;
\r
143 scprintf(_SC("*FUNCTION [%s] %s line [%d]\n"),fn,src,si.line);
\r
145 if(sq_gettop(v)>=1){
\r
146 if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
\r
147 scprintf(_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
\r
148 rdbg->Break(v,si.line,src,_SC("error"),sErr);
\r
151 scprintf(_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
\r
152 rdbg->Break(v,si.line,src,_SC("error"),_SC("unknown"));
\r
155 rdbg->BreakExecution();
\r
160 SQRESULT sq_rdbg_shutdown(HSQREMOTEDBG rdbg)
\r