-/*
- see copyright notice in sqrdbg.h
-*/
-#include <string.h>
-#include <stdio.h>
-#include <squirrel.h>
-#include "sqrdbg.h"
-#include "sqdbgserver.h"
-SQInteger debug_hook(HSQUIRRELVM v);
-SQInteger error_handler(HSQUIRRELVM v);
-
-#include "serialize_state.inl"
-
-HSQREMOTEDBG sq_rdbg_init(HSQUIRRELVM v,unsigned short port,SQBool autoupdate)
-{
- sockaddr_in bindaddr;
-#ifdef _WIN32
- WSADATA wsadata;
- if (WSAStartup (MAKEWORD(1,1), &wsadata) != 0){
- return NULL;
- }
-#endif
-
- SQDbgServer *rdbg = new SQDbgServer(v);
- rdbg->_autoupdate = autoupdate?true:false;
- rdbg->_accept = socket(AF_INET,SOCK_STREAM,0);
- bindaddr.sin_family = AF_INET;
- bindaddr.sin_port = htons(port);
- bindaddr.sin_addr.s_addr = htonl (INADDR_ANY);
- if(bind(rdbg->_accept,(sockaddr*)&bindaddr,sizeof(bindaddr))==SOCKET_ERROR){
- delete rdbg;
- sq_throwerror(v,_SC("failed to bind the socket"));
- return NULL;
- }
- if(!rdbg->Init()) {
- delete rdbg;
- sq_throwerror(v,_SC("failed to initialize the debugger"));
- return NULL;
- }
-
- return rdbg;
-}
-
-SQRESULT sq_rdbg_waitforconnections(HSQREMOTEDBG rdbg)
-{
- if(SQ_FAILED(sq_compilebuffer(rdbg->_v,serialize_state_nut,(SQInteger)scstrlen(serialize_state_nut),_SC("SERIALIZE_STATE"),SQFalse))) {
- sq_throwerror(rdbg->_v,_SC("error compiling the serialization function"));
- }
- sq_getstackobj(rdbg->_v,-1,&rdbg->_serializefunc);
- sq_addref(rdbg->_v,&rdbg->_serializefunc);
- sq_pop(rdbg->_v,1);
-
- sockaddr_in cliaddr;
- socklen_t addrlen=sizeof(cliaddr);
- if(listen(rdbg->_accept,0)==SOCKET_ERROR)
- return sq_throwerror(rdbg->_v,_SC("error on listen(socket)"));
- rdbg->_endpoint = accept(rdbg->_accept,(sockaddr*)&cliaddr,&addrlen);
- //do not accept any other connection
- sqdbg_closesocket(rdbg->_accept);
- rdbg->_accept = INVALID_SOCKET;
- if(rdbg->_endpoint==INVALID_SOCKET){
- return sq_throwerror(rdbg->_v,_SC("error accept(socket)"));
- }
- while(!rdbg->_ready){
- sq_rdbg_update(rdbg);
- }
- return SQ_OK;
-}
-
-SQRESULT sq_rdbg_update(HSQREMOTEDBG rdbg)
-{
- TIMEVAL time;
- time.tv_sec=0;
- time.tv_usec=0;
- fd_set read_flags;
- FD_ZERO(&read_flags);
- FD_SET(rdbg->_endpoint, &read_flags);
- select(FD_SETSIZE, &read_flags, NULL, NULL, &time);
-
- if(FD_ISSET(rdbg->_endpoint,&read_flags)){
- char temp[1024];
- int size=0;
- char c,prev=0;
- memset(&temp,0,sizeof(temp));
- int res;
- FD_CLR(rdbg->_endpoint, &read_flags);
- while((res = recv(rdbg->_endpoint,&c,1,0))>0){
-
- if(c=='\n')break;
- if(c!='\r'){
- temp[size]=c;
- prev=c;
- size++;
- }
- }
- switch(res){
- case 0:
- return sq_throwerror(rdbg->_v,_SC("disconnected"));
- case SOCKET_ERROR:
- return sq_throwerror(rdbg->_v,_SC("socket error"));
- }
-
- temp[size]=0;
- temp[size+1]=0;
- rdbg->ParseMsg(temp);
- }
- return SQ_OK;
-}
-
-SQInteger debug_hook(HSQUIRRELVM v)
-{
- SQUserPointer up;
- SQInteger event_type,line;
- const SQChar *src,*func;
- sq_getinteger(v,2,&event_type);
- sq_getstring(v,3,&src);
- sq_getinteger(v,4,&line);
- sq_getstring(v,5,&func);
- sq_getuserpointer(v,-1,&up);
- HSQREMOTEDBG rdbg = (HSQREMOTEDBG)up;
- rdbg->Hook(event_type,line,src,func);
- if(rdbg->_autoupdate) {
- if(SQ_FAILED(sq_rdbg_update(rdbg)))
- return sq_throwerror(v,_SC("socket failed"));
- }
- return 0;
-}
-
-SQInteger error_handler(HSQUIRRELVM v)
-{
- SQUserPointer up;
- const SQChar *sErr=NULL;
- const SQChar *fn=_SC("unknown");
- const SQChar *src=_SC("unknown");
- int line=-1;
- SQStackInfos si;
- sq_getuserpointer(v,-1,&up);
- HSQREMOTEDBG rdbg=(HSQREMOTEDBG)up;
- if(SQ_SUCCEEDED(sq_stackinfos(v,1,&si)))
- {
- if(si.funcname)fn=si.funcname;
- if(si.source)src=si.source;
- line=si.line;
- scprintf(_SC("*FUNCTION [%s] %s line [%d]\n"),fn,src,si.line);
- }
- if(sq_gettop(v)>=1){
- if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
- scprintf(_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
- rdbg->Break(si.line,src,_SC("error"),sErr);
- }
- else{
- scprintf(_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
- rdbg->Break(si.line,src,_SC("error"),_SC("unknown"));
- }
- }
- rdbg->BreakExecution();
- return 0;
-}
-
-
-SQRESULT sq_rdbg_shutdown(HSQREMOTEDBG rdbg)
-{
- delete rdbg;
-#ifdef _WIN32
- WSACleanup();
-#endif
- return SQ_OK;
-}
+#include <squirrel.h>\r
+#include <winsock.h>\r
+#include <squirrel.h>\r
+#include <squirrel.h>\r
+#include "sqrdbg.h"\r
+#include "sqdbgserver.h"\r
+SQInteger debug_hook(HSQUIRRELVM v);\r
+SQInteger error_handler(HSQUIRRELVM v);\r
+\r
+#include "serialize_state.inl"\r
+\r
+HSQREMOTEDBG sq_rdbg_init(HSQUIRRELVM v,unsigned short port,SQBool autoupdate)\r
+{\r
+ WSADATA wsadata;\r
+ sockaddr_in bindaddr;\r
+#ifdef _WIN32\r
+ if (WSAStartup (MAKEWORD(2,2), &wsadata) != 0){\r
+ return NULL; \r
+ } \r
+#endif \r
+ SQDbgServer *rdbg = new SQDbgServer(v);\r
+ rdbg->_autoupdate = autoupdate?true:false;\r
+ rdbg->_accept = socket(AF_INET,SOCK_STREAM,0);\r
+ bindaddr.sin_family = AF_INET;\r
+ bindaddr.sin_port = htons(port);\r
+ bindaddr.sin_addr.s_addr = htonl (INADDR_ANY);\r
+ if(bind(rdbg->_accept,(sockaddr*)&bindaddr,sizeof(bindaddr))==SOCKET_ERROR){\r
+ delete rdbg;\r
+ sq_throwerror(v,_SC("failed to bind the socket"));\r
+ return NULL;\r
+ }\r
+ if(!rdbg->Init()) {\r
+ delete rdbg;\r
+ sq_throwerror(v,_SC("failed to initialize the debugger"));\r
+ return NULL;\r
+ }\r
+ \r
+ return rdbg;\r
+}\r
+\r
+SQRESULT sq_rdbg_waitforconnections(HSQREMOTEDBG rdbg)\r
+{\r
+ if(SQ_FAILED(sq_compilebuffer(rdbg->_v,serialize_state_nut,(SQInteger)scstrlen(serialize_state_nut),_SC("SERIALIZE_STATE"),SQFalse))) {\r
+ sq_throwerror(rdbg->_v,_SC("error compiling the serialization function"));\r
+ }\r
+ sq_getstackobj(rdbg->_v,-1,&rdbg->_serializefunc);\r
+ sq_addref(rdbg->_v,&rdbg->_serializefunc);\r
+ sq_pop(rdbg->_v,1);\r
+\r
+ sockaddr_in cliaddr;\r
+ int addrlen=sizeof(cliaddr);\r
+ if(listen(rdbg->_accept,0)==SOCKET_ERROR)\r
+ return sq_throwerror(rdbg->_v,_SC("error on listen(socket)"));\r
+ rdbg->_endpoint = accept(rdbg->_accept,(sockaddr*)&cliaddr,&addrlen);\r
+ //do not accept any other connection\r
+ sqdbg_closesocket(rdbg->_accept);\r
+ rdbg->_accept = INVALID_SOCKET;\r
+ if(rdbg->_endpoint==INVALID_SOCKET){\r
+ return sq_throwerror(rdbg->_v,_SC("error accept(socket)"));\r
+ }\r
+ while(!rdbg->_ready){\r
+ sq_rdbg_update(rdbg);\r
+ }\r
+ return SQ_OK;\r
+}\r
+\r
+SQRESULT sq_rdbg_update(HSQREMOTEDBG rdbg)\r
+{\r
+ TIMEVAL time;\r
+ time.tv_sec=0;\r
+ time.tv_usec=0;\r
+ fd_set read_flags;\r
+ FD_ZERO(&read_flags);\r
+ FD_SET(rdbg->_endpoint, &read_flags);\r
+ select(NULL/*ignored*/, &read_flags, NULL, NULL, &time);\r
+\r
+ if(FD_ISSET(rdbg->_endpoint,&read_flags)){\r
+ char temp[1024];\r
+ int size=0;\r
+ char c,prev=NULL;\r
+ memset(&temp,0,sizeof(temp));\r
+ int res;\r
+ FD_CLR(rdbg->_endpoint, &read_flags);\r
+ while((res = recv(rdbg->_endpoint,&c,1,0))>0){\r
+ \r
+ if(c=='\n')break;\r
+ if(c!='\r'){\r
+ temp[size]=c;\r
+ prev=c;\r
+ size++;\r
+ }\r
+ if(size >= sizeof(temp)-2) break;\r
+ }\r
+ switch(res){\r
+\r
+ case 0:\r
+ return sq_throwerror(rdbg->_v,_SC("disconnected"));\r
+ case SOCKET_ERROR:\r
+ return sq_throwerror(rdbg->_v,_SC("socket error"));\r
+ }\r
+ \r
+ temp[size]=NULL;\r
+ temp[size+1]=NULL;\r
+ rdbg->ParseMsg(temp);\r
+ }\r
+ return SQ_OK;\r
+}\r
+\r
+SQInteger debug_hook(HSQUIRRELVM v)\r
+{\r
+ SQUserPointer up;\r
+ SQInteger event_type,line;\r
+ const SQChar *src,*func;\r
+ sq_getinteger(v,2,&event_type);\r
+ sq_getstring(v,3,&src);\r
+ sq_getinteger(v,4,&line);\r
+ sq_getstring(v,5,&func);\r
+ sq_getuserpointer(v,-1,&up);\r
+ HSQREMOTEDBG rdbg = (HSQREMOTEDBG)up;\r
+ rdbg->Hook(v,event_type,line,src,func);\r
+ if(rdbg->_autoupdate) {\r
+ if(SQ_FAILED(sq_rdbg_update(rdbg)))\r
+ return sq_throwerror(v,_SC("socket failed"));\r
+ }\r
+ return 0;\r
+}\r
+\r
+SQInteger error_handler(HSQUIRRELVM v)\r
+{\r
+ SQUserPointer up;\r
+ const SQChar *sErr=NULL;\r
+ const SQChar *fn=_SC("unknown");\r
+ const SQChar *src=_SC("unknown");\r
+ SQInteger line=-1;\r
+ SQStackInfos si;\r
+ sq_getuserpointer(v,-1,&up);\r
+ HSQREMOTEDBG rdbg=(HSQREMOTEDBG)up;\r
+ if(SQ_SUCCEEDED(sq_stackinfos(v,1,&si)))\r
+ {\r
+ if(si.funcname)fn=si.funcname;\r
+ if(si.source)src=si.source;\r
+ line=si.line;\r
+ scprintf(_SC("*FUNCTION [%s] %s line [%d]\n"),fn,src,si.line);\r
+ }\r
+ if(sq_gettop(v)>=1){\r
+ if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {\r
+ scprintf(_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);\r
+ rdbg->Break(v,si.line,src,_SC("error"),sErr);\r
+ }\r
+ else{\r
+ scprintf(_SC("\nAN ERROR HAS OCCURED [unknown]\n"));\r
+ rdbg->Break(v,si.line,src,_SC("error"),_SC("unknown"));\r
+ }\r
+ }\r
+ rdbg->BreakExecution();\r
+ return 0;\r
+}\r
+\r
+\r
+SQRESULT sq_rdbg_shutdown(HSQREMOTEDBG rdbg)\r
+{\r
+ delete rdbg;\r
+#ifdef _WIN32\r
+ WSACleanup();\r
+#endif\r
+ return SQ_OK;\r
+}\r