#ifndef _DEFINE_PLATFORM_H #define _DEFINE_PLATFORM_H //VC++ defines _WIN32 and _DEBUG #ifndef _WIN32 #define _LINUX #endif typedef short unsigned int PERCENTAGE; #ifdef _LINUX #include //close() #include //fcntl() for async signal control #include //ioctl() for async #include #include //sockets #include //gethostbyname() #include //sockaddr_in #include //inet_ntoa(in_addr) #include //#define REGEX_STACK_ALIGNMENT 16 //-------------------------------------------------- sockets //http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html #define SOCKET int #define INITSOCKET 000 //no init required for the UNIX sockets #define FINALISESOCKET 000 #define SOCKET_INPROGRESS SOCKET_LASTERROR == EINPROGRESS || SOCKET_LASTERROR == EISCONN #define CLOSESOCKET(handle) ::close(handle) #define SOCKET_ERROR -1 #define INVALID_SOCKET -1 #define SOCKET_LASTERROR errno #define SETASYNC(s) {fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK);} #define SETKEEPALIVE(s,t) {bool on = true; int tinterval = t; setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(int)); } #define SETLINGER(s,t) {linger twait = {1,t}; setsockopt(s, SOL_SOCKET, SO_LINGER, &twait, sizeof(linger));} #define LPSOCKADDR sockaddr* #define FD_COUNT(set) bitcount(&set, sizeof(fd_set)) #define FD_EMPTY(set) iszero(&set, sizeof(fd_set)) #define FD_COPY(from, to) fd_copy(from, to) #define IGNORE_SIGPIPE signal(SIGPIPE, catch_SIGPIPE); //-------------------------------------------------- threading //types #define pthread_invalidate(t) t = 0 #define pthread_isvalid(t) t != 0 #define MEMBER_INIT_MUTEX(mutex) {pthread_mutex_t copy = PTHREAD_MUTEX_INITIALIZER; memcpy(&mutex, ©, sizeof(pthread_mutex_t));} #define MEMBER_INIT_COND(cond) {pthread_cond_t copy = PTHREAD_COND_INITIALIZER; memcpy(&cond, ©, sizeof(pthread_cond_t) );} #define THREAD_CALLBACK_TYPE LPVOID //defined in windef.h //-------------------------------------------------- types typedef void* LPVOID; //defined in windef.h //-------------------------------------------------- misc //function call status macros - these are already defined by DEVENV in WINDOWS #define FALSE 0 //defined in windef.h as 0 #define S_OK 0x00000000L #define E_FAIL 0x80004005L #define E_NOTIMPL 0x80004001L #define HRESULT int #define SUCCEEDED(t) (t)==0 #define FAILED(t) !SUCCEEDED(t) #define VALID(t) (t)!=0 //other #define DIRSPLITTER "/" //function aliases #define _STRNCASECMP(s1,s2,n) strncasecmp(s1,s2,n) #define _STRCASECMP(s1,s2) strcasecmp(s1,s2) #define _STRCMP(s1,s2) strcmp(s1,s2) #define _STRNCMP(s1,s2,n) strncmp(s1,s2,n) #define _STRDUP(a) strdup(a) #define _STRNCPY(sDest, sSource, iChars) strncpy(sDest,sSource,iChars); #define _SNPRINTF(dest, size, format, ...) snprintf(dest, size, format, __VA_ARGS__) #define _FOPEN(pFile,Name,Mode) pFile=fopen(Name,Mode) #define _SLEEP(s) sleep(s) #endif #ifdef _WIN32 #include #include #include #include //port of the pthread to Windows //-------------------------------------------------- sockets //http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html //#define SOCKET int #define INITSOCKET WSADATA w;WORD vVersionRequired = 0x0202;if (WSAStartup(vVersionRequired, &w)) exit(2) #define FINALISESOCKET WSACleanup() #define SOCKET_INPROGRESS SOCKET_LASTERROR == WSAEISCONN || SOCKET_LASTERROR == WSAEWOULDBLOCK #define CLOSESOCKET(handle) ::closesocket(handle) //#define SOCKET_ERROR -1 //defined in winsock2.h //#define INVALID_SOCKET -1 #define SOCKET_LASTERROR WSAGetLastError() #define SETASYNC(s) {u_long iMode=1;ioctlsocket(s, FIONBIO, &iMode);} #define SETKEEPALIVE(s,t) {BOOL val = TRUE; setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char*)&val, sizeof(int));} #define SETLINGER(s,t) 000 //#define LPSOCKADDR sockaddr_in* #define FD_COUNT(set) set.fd_count #define FD_EMPTY(set) (set.fd_count == 0) #define FD_COPY(from, to) fd_copy(from, to) #define IGNORE_SIGPIPE 000 //-------------------------------------------------- threading //typedef struct { // void * p; //Pointer to actual object // unsigned int x; // Extra information - reuse count etc //} pthread_t; #define pthread_invalidate(t) memset(&t, 0, sizeof(t)) #define pthread_isvalid(t) t.p != 0 #define MEMBER_INIT_MUTEX(mutex) mutex = PTHREAD_MUTEX_INITIALIZER #define MEMBER_INIT_COND(cond) cond = PTHREAD_COND_INITIALIZER #define THREAD_CALLBACK_TYPE LPVOID //defined in windef.h //-------------------------------------------------- types //typedef void* LPVOID; //defined in windef.h //other #define DIRSPLITTER "\\" //-------------------------------------------------- function aliases //windows prefers use of _snprintf_s with additional maxLength parameter #define _STRNCASECMP(s1,s2,n) strnicmp(s1,s2,n) #define _STRCASECMP(s1,s2) stricmp(s1,s2) #define _STRCMP(s1,s2) strcmp(s1,s2) #define _STRNCMP(s1,s2,n) strncmp(s1,s2,n) #define _STRDUP(a) _strdup(a) #define _STRNCPY(sDest, sSource, iChars) strncpy_s(sDest,iChars+1,sSource,iChars); #define _SNPRINTF(dest, size, format, ...) _snprintf_s(dest, size, size-1, format, __VA_ARGS__) #define _FOPEN(pFile,Name,Mode) fopen_s(&pFile,Name,Mode) //fopen depreciated for fopen_s #define _SLEEP(s) Sleep(s) #endif #endif