X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/95ed00257adf283a2740cb3e4feb83c075620ef8..974aae61bbb8c05e0d0fc1a95b419fe596423fd8:/src/w32.h diff --git a/src/w32.h b/src/w32.h index f5a701dcb1..622a2256f0 100644 --- a/src/w32.h +++ b/src/w32.h @@ -1,3 +1,6 @@ +#ifndef EMACS_W32_H +#define EMACS_W32_H + /* Support routines for the NT version of Emacs. Copyright (C) 1994 Free Software Foundation, Inc. @@ -15,36 +18,124 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ + /* File descriptor set emulation. */ -#ifdef FD_SET -/* We could get this from param.h, but better not to depend on finding that. - And better not to risk that it might define other symbols used in this - file. */ -#ifdef FD_SETSIZE -#define MAXDESC FD_SETSIZE -#else -#define MAXDESC 64 -#endif +/* MSVC runtime library has limit of 64 descriptors by default */ +#define FD_SETSIZE 64 +typedef struct { + unsigned int bits[FD_SETSIZE / 32]; +} fd_set; + +/* standard access macros */ +#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 -#else /* no FD_SET */ -#define MAXDESC 32 -#define SELECT_TYPE int -/* Define the macros to access a single-int bitmap of descriptors. */ -#define FD_SET(n, p) (*(p) |= (1 << (n))) -#define FD_CLR(n, p) (*(p) &= ~(1 << (n))) -#define FD_ISSET(n, p) (*(p) & (1 << (n))) -#define FD_ZERO(p) (*(p) = 0) -#endif /* no FD_SET */ +/* ------------------------------------------------------------------------- */ + +/* child_process.status values */ +enum { + STATUS_READ_ERROR = -1, + STATUS_READ_READY, + STATUS_READ_IN_PROGRESS, + STATUS_READ_FAILED, + STATUS_READ_SUCCEEDED, + STATUS_READ_ACKNOWLEDGED +}; + +/* This structure is used for both pipes and sockets; for + a socket, the process handle in pi is NULL. */ +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) + +/* parallel array of private info on file handles */ +typedef struct +{ + unsigned flags; + HANDLE hnd; + child_process * cp; +} filedesc; + +extern filedesc fd_info [ MAXDESC ]; + +/* fd_info flag definitions */ +#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 +#define FILE_NDELAY 0x0400 + +extern child_process * new_child (void); +extern void delete_child (child_process *cp); + +/* ------------------------------------------------------------------------- */ + +/* Equivalent of strerror for W32 error codes. */ +extern char * w32_strerror (int error_no); + +/* Get long (aka "true") form of file name, if it exists. */ +extern BOOL w32_get_long_filename (char * name, char * buf, int size); /* Prepare our standard handles for proper inheritance by child processes. */ -extern void prepare_standard_handles (int in, int out, +extern void prepare_standard_handles (int in, int out, int err, HANDLE handles[4]); /* Reset our standard handles to their original state. */ -extern void reset_standard_handles (int in, int out, +extern void reset_standard_handles (int in, int out, int err, HANDLE handles[4]); +/* Return the string resource associated with KEY of type TYPE. */ +extern LPBYTE w32_get_resource (char * key, LPDWORD type); + +extern void init_ntproc (void); +extern void term_ntproc (void); +extern void globals_of_w32 (void); +extern void syms_of_w32term (void); +extern void syms_of_w32fns (void); +extern void globals_of_w32fns (void); +extern void syms_of_w32select (void); +extern void globals_of_w32select (void); +extern void term_w32select (void); +extern void syms_of_w32menu (void); +extern void globals_of_w32menu (void); +extern void syms_of_fontset (void); + +#endif /* EMACS_W32_H */ + +/* arch-tag: 02c36b00-312b-4c4d-a1d9-f905c5e968f0 + (do not change this comment) */