#ifndef EMACS_W32_H
#define EMACS_W32_H
#define FD_SETSIZE 64
typedef struct {
unsigned int bits[FD_SETSIZE / 32];
} fd_set;
#define FD_SET(n, p) \
do { \
if ((n) < FD_SETSIZE) { \
(p)->bits[(n)/32] |= (1 << (n)%32); \
} \
} while (0)
#define FD_CLR(n, p) \
do { \
if ((n) < FD_SETSIZE) { \
(p)->bits[(n)/32] &= ~(1 << (n)%32); \
} \
} while (0)
#define FD_ISSET(n, p) ((n) < FD_SETSIZE ? ((p)->bits[(n)/32] & (1 << (n)%32)) : 0)
#define FD_ZERO(p) memset((p), 0, sizeof(fd_set))
#define SELECT_TYPE fd_set
enum {
STATUS_READ_ERROR = -1,
STATUS_READ_READY,
STATUS_READ_IN_PROGRESS,
STATUS_READ_FAILED,
STATUS_READ_SUCCEEDED,
STATUS_READ_ACKNOWLEDGED
};
typedef struct _child_process
{
int fd;
int pid;
HANDLE char_avail;
HANDLE char_consumed;
HANDLE thrd;
HWND hwnd;
PROCESS_INFORMATION procinfo;
volatile int status;
char chr;
} child_process;
#define MAXDESC FD_SETSIZE
#define MAX_CHILDREN MAXDESC/2
#define CHILD_ACTIVE(cp) ((cp)->char_avail != NULL)
typedef struct
{
unsigned flags;
HANDLE hnd;
child_process * cp;
} filedesc;
extern filedesc fd_info [ MAXDESC ];
#define FILE_READ 0x0001
#define FILE_WRITE 0x0002
#define FILE_BINARY 0x0010
#define FILE_LAST_CR 0x0020
#define FILE_AT_EOF 0x0040
#define FILE_SEND_SIGCHLD 0x0080
#define FILE_PIPE 0x0100
#define FILE_SOCKET 0x0200
extern child_process * new_child (void);
extern void delete_child (child_process *cp);
extern char * w32_strerror (int error_no);
extern BOOL w32_get_long_filename (char * name, char * buf, int size);
extern void prepare_standard_handles (int in, int out,
int err, HANDLE handles[4]);
extern void reset_standard_handles (int in, int out,
int err, HANDLE handles[4]);
extern LPBYTE w32_get_resource (char * key, LPDWORD type);
extern void init_ntproc ();
extern void term_ntproc ();
#endif