#ifndef _XPOLL_H_
#define _XPOLL_H_
#ifndef WIN32
#ifndef USE_POLL
#include <X11/Xos.h>
#if !defined(DGUX)
#if (defined(SVR4) || defined(CRAY) || defined(AIXV3)) && !defined(FD_SETSIZE)
#include <sys/select.h>
#ifdef luna
#include <sysent.h>
#endif
#endif
#else
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#endif
#ifdef __QNX__
#define FD_SETSIZE 256
#include <sys/select.h>
#endif
#if defined(AIXV4) && !defined(NFDBITS)
#include <sys/select.h>
#endif
#include <X11/Xmd.h>
#ifdef CSRG_BASED
#include <sys/param.h>
# if BSD < 199103
typedef long fd_mask;
# endif
#endif
#define XFD_SETSIZE 256
#ifndef FD_SETSIZE
#define FD_SETSIZE XFD_SETSIZE
#endif
#ifndef NBBY
#define NBBY 8
#endif
#ifndef NFDBITS
#define NFDBITS (sizeof(fd_mask) * NBBY)
#endif
#ifndef howmany
#define howmany(x,y) (((x)+((y)-1))/(y))
#endif
#ifdef BSD
# if BSD < 198911
# ifndef luna
typedef struct fd_set {
fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
} fd_set;
# endif
# endif
#endif
#ifndef hpux
# define Select(n,r,w,e,t) select(n,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)
#else
# ifndef _XPG4_EXTENDED
# define Select(n,r,w,e,t) select(n,(int*)r,(int*)w,(int*)e,(struct timeval*)t)
# else
# define Select(n,r,w,e,t) select(n,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)
# endif
#endif
#ifndef FD_SET
#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= ((fd_mask)1 << ((n) % NFDBITS)))
#endif
#ifndef FD_CLR
#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~((fd_mask)1 << ((n) % NFDBITS)))
#endif
#ifndef FD_ISSET
#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & ((fd_mask)1 << ((n) % NFDBITS)))
#endif
#ifndef FD_ZERO
#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
#endif
#define XFD_ANYSET(p) \
((p)->fds_bits[0] || (p)->fds_bits[1] || \
(p)->fds_bits[2] || (p)->fds_bits[3] || \
(p)->fds_bits[4] || (p)->fds_bits[5] || \
(p)->fds_bits[6] || (p)->fds_bits[7])
#define XFD_COPYSET(src,dst) \
(dst)->fds_bits[0] = (src)->fds_bits[0]; \
(dst)->fds_bits[1] = (src)->fds_bits[1]; \
(dst)->fds_bits[2] = (src)->fds_bits[2]; \
(dst)->fds_bits[3] = (src)->fds_bits[3]; \
(dst)->fds_bits[4] = (src)->fds_bits[4]; \
(dst)->fds_bits[5] = (src)->fds_bits[5]; \
(dst)->fds_bits[6] = (src)->fds_bits[6]; \
(dst)->fds_bits[7] = (src)->fds_bits[7];
#define XFD_ANDSET(dst,b1,b2) \
(dst)->fds_bits[0] = ((b1)->fds_bits[0] & (b2)->fds_bits[0]); \
(dst)->fds_bits[1] = ((b1)->fds_bits[1] & (b2)->fds_bits[1]); \
(dst)->fds_bits[2] = ((b1)->fds_bits[2] & (b2)->fds_bits[2]); \
(dst)->fds_bits[3] = ((b1)->fds_bits[3] & (b2)->fds_bits[3]); \
(dst)->fds_bits[4] = ((b1)->fds_bits[4] & (b2)->fds_bits[4]); \
(dst)->fds_bits[5] = ((b1)->fds_bits[5] & (b2)->fds_bits[5]); \
(dst)->fds_bits[6] = ((b1)->fds_bits[6] & (b2)->fds_bits[6]); \
(dst)->fds_bits[7] = ((b1)->fds_bits[7] & (b2)->fds_bits[7]);
#define XFD_ORSET(dst,b1,b2) \
(dst)->fds_bits[0] = ((b1)->fds_bits[0] | (b2)->fds_bits[0]); \
(dst)->fds_bits[1] = ((b1)->fds_bits[1] | (b2)->fds_bits[1]); \
(dst)->fds_bits[2] = ((b1)->fds_bits[2] | (b2)->fds_bits[2]); \
(dst)->fds_bits[3] = ((b1)->fds_bits[3] | (b2)->fds_bits[3]); \
(dst)->fds_bits[4] = ((b1)->fds_bits[4] | (b2)->fds_bits[4]); \
(dst)->fds_bits[5] = ((b1)->fds_bits[5] | (b2)->fds_bits[5]); \
(dst)->fds_bits[6] = ((b1)->fds_bits[6] | (b2)->fds_bits[6]); \
(dst)->fds_bits[7] = ((b1)->fds_bits[7] | (b2)->fds_bits[7]);
#define XFD_UNSET(dst,b1) \
(dst)->fds_bits[0] &= ~((b1)->fds_bits[0]); \
(dst)->fds_bits[1] &= ~((b1)->fds_bits[1]); \
(dst)->fds_bits[2] &= ~((b1)->fds_bits[2]); \
(dst)->fds_bits[3] &= ~((b1)->fds_bits[3]); \
(dst)->fds_bits[4] &= ~((b1)->fds_bits[4]); \
(dst)->fds_bits[5] &= ~((b1)->fds_bits[5]); \
(dst)->fds_bits[6] &= ~((b1)->fds_bits[6]); \
(dst)->fds_bits[7] &= ~((b1)->fds_bits[7]);
#else
#include <sys/poll.h>
#endif
#else
#define XFD_SETSIZE 256
#ifndef FD_SETSIZE
#define FD_SETSIZE XFD_SETSIZE
#endif
#include <X11/Xwinsock.h>
#define Select(n,r,w,e,t) select(0,(fd_set*)r,(fd_set*)w,(fd_set*)e,(struct timeval*)t)
#define XFD_SETCOUNT(p) (((fd_set FAR *)(p))->fd_count)
#define XFD_FD(p,i) (((fd_set FAR *)(p))->fd_array[i])
#define XFD_ANYSET(p) XFD_SETCOUNT(p)
#define XFD_COPYSET(src,dst) { \
u_int __i; \
FD_ZERO(dst); \
for (__i = 0; __i < XFD_SETCOUNT(src) ; __i++) { \
XFD_FD(dst,__i) = XFD_FD(src,__i); \
} \
XFD_SETCOUNT(dst) = XFD_SETCOUNT(src); \
}
#define XFD_ANDSET(dst,b1,b2) { \
u_int __i; \
FD_ZERO(dst); \
for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) { \
if (FD_ISSET(XFD_FD(b1,__i), b2)) \
FD_SET(XFD_FD(b1,__i), dst); \
} \
}
#define XFD_ORSET(dst,b1,b2) { \
u_int __i; \
XFD_COPYSET(b1,dst); \
for (__i = 0; __i < XFD_SETCOUNT(b2) ; __i++) { \
if (!FD_ISSET(XFD_FD(b2,__i), dst)) \
FD_SET(XFD_FD(b2,__i), dst); \
} \
}
#define XFD_UNSET(dst,b1) { \
u_int __i; \
for (__i = 0; __i < XFD_SETCOUNT(b1) ; __i++) { \
FD_CLR(XFD_FD(b1,__i), dst); \
} \
}
#undef FD_SET
#define FD_SET(fd,set) do { \
if (XFD_SETCOUNT(set) < FD_SETSIZE && !FD_ISSET(fd,set)) \
XFD_FD(set,XFD_SETCOUNT(set)++)=(fd); \
} while(0)
#define getdtablesize() FD_SETSIZE
#endif
#endif