Use typedef for EMACS_INT, EMACS_UINT.
[bpt/emacs.git] / src / s / ms-w32.h
index b9e5768..bcc4c42 100644 (file)
@@ -1,6 +1,6 @@
 /* System description file for Windows NT.
-   Copyright (C) 1993, 1994, 1995, 2001, 2002, 2003, 2004, 2005, 2006,
-                 2007, 2008, 2009, 2010, 2011  Free Software Foundation, Inc.
+
+Copyright (C) 1993-1995, 2001-2012  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -17,10 +17,8 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
-/*
- *      Define symbols to identify the version of Unix this is.
- *      Define all the symbols that apply correctly.
- */
+/* Define symbols to identify the version of Unix this is.
+   Define all the symbols that apply correctly.  */
 
 #ifndef WINDOWSNT
 #define WINDOWSNT
@@ -29,195 +27,148 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define DOS_NT         /* MSDOS or WINDOWSNT */
 #endif
 
+/* #undef const */
+
 /* If you are compiling with a non-C calling convention but need to
-   declare vararg routines differently, put it here */
+   declare vararg routines differently, put it here */
 #define _VARARGS_ __cdecl
 
 /* If you are providing a function to something that will call the
    function back (like a signal handler and signal, or main) its calling
-   convention must be whatever standard the libraries expect */
+   convention must be whatever standard the libraries expect */
 #define _CALLBACK_ __cdecl
 
-/* SYSTEM_TYPE should indicate the kind of system you are using.
- It sets the Lisp variable system-type.  */
-
-#define SYSTEM_TYPE "windows-nt"
-#define SYMS_SYSTEM syms_of_ntterm ()
-
-#define NO_MATHERR 1
-
-/* Letter to use in finding device name of first pty,
-  if system supports pty's.  'a' means it is /dev/ptya0  */
-
-#define FIRST_PTY_LETTER 'a'
-
-/*
- *      Define HAVE_TIMEVAL if the system supports the BSD style clock values.
- *      Look in <sys/time.h> for a timeval structure.
- */
-
+/* Define HAVE_TIMEVAL if the system supports the BSD style clock values.
+   Look in <sys/time.h> for a timeval structure.  */
 #define HAVE_TIMEVAL 1
 
-/* NT supports Winsock which is close enough (with some hacks) */
-
-#define HAVE_SOCKETS 1
-
 /* But our select implementation doesn't allow us to make non-blocking
    connects.  So until that is fixed, this is necessary:  */
-
 #define BROKEN_NON_BLOCKING_CONNECT 1
 
 /* And the select implementation does 1-byte read-ahead waiting
    for received packets, so datagrams are broken too.  */
-
 #define BROKEN_DATAGRAM_SOCKETS 1
 
-/* Define this symbol if your system has the functions bcopy, etc. */
-
-#define BSTRING
-#define bzero(b, l) memset(b, 0, l)
-#define bcopy(s, d, l) memmove(d, s, l)
-#define bcmp(a, b, l) memcmp(a, b, l)
-
-/* bcopy (aka memmove aka memcpy at least on x86) under MSVC is quite safe */
-#define GAP_USE_BCOPY 1
-#define BCOPY_UPWARD_SAFE 1
-#define BCOPY_DOWNWARD_SAFE 1
-
-/* If your system uses COFF (Common Object File Format) then define the
-   preprocessor symbol "COFF". */
-
-#define COFF 1
-
-/* define MAIL_USE_FLOCK if the mailer uses flock
-   to interlock access to /usr/spool/mail/$USER.
-   The alternative is that a lock file named
-   /usr/spool/mail/$USER.lock.  */
-
-/* #define MAIL_USE_FLOCK */
-#define MAIL_USE_POP 1
 #define MAIL_USE_SYSTEM_LOCK 1
 
 /* If the character used to separate elements of the executable path
    is not ':', #define this to be the appropriate character constant.  */
 #define SEPCHAR ';'
 
-#define ORDINARY_LINK 1
+/* Define to 1 if GCC-style __attribute__ ((__aligned__ (expr))) works. */
+#ifdef __GNUC__
+#define HAVE_ATTRIBUTE_ALIGNED 1
+#endif
 
-/* ============================================================ */
+/* Define to 1 if strtold conforms to C99. */
+#ifdef __GNUC__
+#define HAVE_C99_STRTOLD 1
+#endif
 
-/* Here, add any special hacks needed
-   to make Emacs work on this system.  For example,
-   you might define certain system call names that don't
-   exist on your system, or that do different things on
-   your system and must be used only through an encapsulation
-   (Which you should place, by convention, in sysdep.c).  */
+#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
+#define HAVE___BUILTIN_UNWIND_INIT 1
+#endif
+
+/* ============================================================ */
 
-/* Define this to be the separator between path elements */
-#define DIRECTORY_SEP XINT (Vdirectory_sep_char)
+/* Here, add any special hacks needed to make Emacs work on this
+   system.  For example, you might define certain system call names
+   that don't exist on your system, or that do different things on
+   your system and must be used only through an encapsulation (which
+   you should place, by convention, in sysdep.c).  */
 
-/* Define this to be the separator between devices and paths */
+/* Define this to be the separator between devices and paths */
 #define DEVICE_SEP ':'
 
 /* We'll support either convention on NT.  */
 #define IS_DIRECTORY_SEP(_c_) ((_c_) == '/' || (_c_) == '\\')
 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_) || IS_DEVICE_SEP (_c_))
 
-/* The null device on Windows NT. */
+#ifdef __GNUC__
+#ifndef __cplusplus
+#undef inline
+#endif
+#else  /* MSVC */
+#define inline __inline
+#endif
+
+#ifdef __GNUC__
+# define restrict __restrict__
+#else
+# define restrict
+#endif
+
+/* `mode_t' is not defined for MSVC. Define. */
+#ifdef _MSC_VER
+typedef unsigned short mode_t;
+#endif
+
+/* A va_copy replacement for MSVC.  */
+#ifdef _MSC_VER
+# ifdef _WIN64
+#  ifndef va_copy               /* Need to be checked (?) */
+#   define va_copy(d,s) ((d) = (s))
+#  endif
+# else /* not _WIN64 */
+#  define va_copy(d,s) ((d) = (s))
+# endif         /* not _WIN64 */
+#endif  /* _MSC_VER */
+
+#ifndef WINDOWSNT
+/* Some of the files of Emacs which are intended for use with other
+   programs assume that if you have a config.h file, you must declare
+   the type of getenv.  */
+extern char *getenv ();
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include "strings.h"
+#endif
+#include <sys/types.h>
+
+#ifdef _MSC_VER
+typedef unsigned long sigset_t;
+typedef int ssize_t;
+#endif
+
+struct sigaction {
+  int sa_flags;
+  void (*sa_handler)(int);
+  sigset_t sa_mask;
+};
+#define SIG_BLOCK       1
+#define SIG_SETMASK     2
+#define SIG_UNBLOCK     3
+
+/* The null device on Windows NT.  */
 #define NULL_DEVICE     "NUL:"
 
 #ifndef MAXPATHLEN
 #define MAXPATHLEN      _MAX_PATH
 #endif
 
-#define HAVE_SOUND  1
-#define LISP_FLOAT_TYPE 1
-
-#undef  HAVE_SYS_SELECT_H
-#define HAVE_SYS_TIMEB_H 1
-#define HAVE_SYS_TIME_H 1
-#define HAVE_UNISTD_H 1
-#undef  HAVE_UTIME_H
-#undef  HAVE_LINUX_VERSION_H
-#undef  HAVE_SYS_SYSTEMINFO_H
-#undef  HAVE_TERMIOS_H
-#define HAVE_LIMITS_H 1
-#define HAVE_STRING_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_PWD_H 1
-#define STDC_HEADERS 1
-#define TIME_WITH_SYS_TIME 1
-
-#define HAVE_GETTIMEOFDAY 1
-#define HAVE_GETHOSTNAME 1
-#undef  HAVE_GETDOMAINNAME
-#define HAVE_DUP2 1
-#define HAVE_RENAME 1
-#define HAVE_CLOSEDIR 1
-#define HAVE_FSYNC 1           /* fsync is called _commit in MSVC.  */
-
-#undef  TM_IN_SYS_TIME
-#undef  HAVE_TM_ZONE
-
-#define HAVE_LONG_FILE_NAMES 1
-
-#define HAVE_MKDIR 1
-#define HAVE_RMDIR 1
-#define HAVE_RANDOM 1
-#undef  HAVE_SYSINFO
-#undef  HAVE_LRAND48
-#define HAVE_BCOPY 1
-#define HAVE_BCMP 1
-#define HAVE_LOGB 1
-#define HAVE_FREXP 1
-#define HAVE_FMOD 1
-#undef  HAVE_RINT
-#undef  HAVE_CBRT
-#define HAVE_FTIME 1
-#undef  HAVE_RES_INIT /* For -lresolv on Suns.  */
-#undef  HAVE_SETSID
-#undef  HAVE_FPATHCONF
-#define HAVE_SELECT 1
-#define HAVE_MKTIME 1
-#undef  HAVE_EUIDACCESS
-#define HAVE_GETPAGESIZE 1
-#define HAVE_TZSET 1
-#define HAVE_SETLOCALE 1
-#undef  HAVE_UTIMES
-#undef  HAVE_SETRLIMIT
-#undef  HAVE_SETPGID
-#undef  HAVE_GETCWD
-#define HAVE_SHUTDOWN 1
-#define HAVE_STRFTIME 1
-
-#define LOCALTIME_CACHE
-#define HAVE_INET_SOCKETS 1
-
-#undef  HAVE_AIX_SMT_EXP
-#define USE_TOOLKIT_SCROLL_BARS 1
-
-/* Define if you have the ANSI `strerror' function.
-   Otherwise you must have the variable `char *sys_errlist[]'.  */
-#define HAVE_STRERROR 1
-
-/* Define if `struct utimbuf' is declared by <utime.h>.  */
-#undef  HAVE_STRUCT_UTIMBUF
-
-#define HAVE_MOUSE 1
-#define HAVE_H_ERRNO 1
-
 #ifdef HAVE_NTGUI
 #define HAVE_WINDOW_SYSTEM 1
 #define HAVE_MENUS 1
 #endif
 
-#define MODE_LINE_BINARY_TEXT(_b_) (NILP ((_b_)->buffer_file_type) ? "T" : "B")
-
-/* get some redefinitions in place */
+/* Get some redefinitions in place.  */
 
 #ifdef emacs
 
-/* calls that are emulated or shadowed */
+#ifdef _MSC_VER
+#include <sys/timeb.h>
+#include <sys/stat.h>
+#include <signal.h>
+
+/* MSVC gets link-time errors without these redirections.  */
+#define fstat(a, b) sys_fstat(a, b)
+#define stat(a, b)  sys_stat(a, b)
+#define utime       sys_utime
+#endif
+
+/* Calls that are emulated or shadowed.  */
 #undef access
 #define access  sys_access
 #undef chdir
@@ -248,6 +199,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define rename  sys_rename
 #define rmdir   sys_rmdir
 #define select  sys_select
+#define pselect sys_select
 #define sleep   sys_sleep
 #define strerror sys_strerror
 #undef unlink
@@ -255,15 +207,26 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #undef write
 #define write   sys_write
 
-/* subprocess calls that are emulated */
+/* Subprocess calls that are emulated.  */
 #define spawnve sys_spawnve
 #define wait    sys_wait
 #define kill    sys_kill
 #define signal  sys_signal
 
+/* termcap.c calls that are emulated.  */
+#define tputs   sys_tputs
+#define tgetstr sys_tgetstr
+
+/* cm.c calls that are emulated.  */
+#define chcheckmagic sys_chcheckmagic
+#define cmcostinit   sys_cmcostinit
+#define cmgoto       sys_cmgoto
+#define cmputc       sys_cmputc
+#define Wcm_clear    sys_Wcm_clear
+
 #endif /* emacs */
 
-/* map to MSVC names */
+/* Map to MSVC names.  */
 #define execlp    _execlp
 #define execvp    _execvp
 #define fdopen   _fdopen
@@ -275,6 +238,8 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define getpid    _getpid
 #ifdef _MSC_VER
 typedef int pid_t;
+#define snprintf  _snprintf
+#define strtoll   _strtoi64
 #endif
 #define isatty    _isatty
 #define logb      _logb
@@ -283,22 +248,38 @@ typedef int pid_t;
 #define popen     _popen
 #define pclose    _pclose
 #define umask    _umask
+#ifndef _MSC_VER
 #define utimbuf          _utimbuf
-#define index     strchr
-#define rindex    strrchr
+#endif
 #define strdup    _strdup
 #define strupr    _strupr
 #define strnicmp  _strnicmp
 #define stricmp   _stricmp
 #define tzset     _tzset
 
-#if !defined (_MSC_VER) || (_MSC_VER < 1400)
+/* Include time.h before redirecting tzname, since MSVC's time.h
+   defines _tzname to call a function, but also declares tzname a
+   2-element array.  Having the redirection before including the
+   header thus has the effect of declaring a function that returns an
+   array, and triggers an error message.  */
+#include <time.h>
 #define tzname    _tzname
+#if !defined (_MSC_VER) || (_MSC_VER < 1400)
+#undef  utime
 #define utime    _utime
 #endif
 
-/* this is hacky, but is necessary to avoid warnings about macro
-   redefinitions using the SDK compilers */
+/* 'struct timespec' is used by time-related functions in lib/ and
+   elsewhere, but we don't use lib/time.h where the structure is
+   defined.  */
+struct timespec
+{
+  time_t       tv_sec;         /* seconds */
+  long int     tv_nsec;        /* nanoseconds */
+};
+
+/* This is hacky, but is necessary to avoid warnings about macro
+   redefinitions using the SDK compilers.  */
 #ifndef __STDC__
 #define __STDC__ 1
 #define MUST_UNDEF__STDC__
@@ -311,7 +292,7 @@ typedef int pid_t;
 #undef MUST_UNDEF__STDC__
 #endif
 
-/* Defines that we need that aren't in the standard signal.h  */
+/* Defines that we need that aren't in the standard signal.h.  */
 #define SIGHUP  1               /* Hang up */
 #define SIGQUIT 3               /* Quit process */
 #define SIGTRAP 5               /* Trace trap */
@@ -343,19 +324,39 @@ extern char *get_emacs_configuration_options (void);
 #define _WINSOCKAPI_    1
 #define _WINSOCK_H
 
+/* Prevent accidental use of features unavailable in
+   older Windows versions we still support.  */
+#define _WIN32_WINNT 0x0400
+
+/* Make a leaner executable.  */
+#define WIN32_LEAN_AND_MEAN 1
+
 /* Defines size_t and alloca ().  */
-#ifdef USE_CRT_DLL
+#ifdef emacs
 #define malloc e_malloc
 #define free   e_free
 #define realloc e_realloc
 #define calloc e_calloc
 #endif
+#ifdef _MSC_VER
+#define alloca _alloca
+#else
 #include <malloc.h>
+#endif
+
+/* stdlib.h must be included after redefining malloc & friends, but
+   before redefining abort.  Isn't library redefinition funny?  */
+#include <stdlib.h>
+
+/* Redefine abort.  */
+#ifdef HAVE_NTGUI
+#define abort  w32_abort
+extern _Noreturn void w32_abort (void);
+#endif
 
 #include <sys/stat.h>
 
-/* Define for those source files that do not include enough NT
-   system files.  */
+/* Define for those source files that do not include enough NT system files.  */
 #ifndef NULL
 #ifdef __cplusplus
 #define NULL   0
@@ -365,15 +366,42 @@ extern char *get_emacs_configuration_options (void);
 #endif
 
 /* For proper declaration of environ.  */
-#include <stdlib.h>
 #ifndef sys_nerr
 #define sys_nerr _sys_nerr
 #endif
-#include <string.h>
+
+extern int getloadavg (double *, int);
+
+#if defined (__MINGW32__) || _MSC_VER >= 1400
+
+/* Define to 1 if the system has the type `long long int'. */
+# define HAVE_LONG_LONG_INT 1
+
+/* Define to 1 if the system has the type `unsigned long long int'. */
+# define HAVE_UNSIGNED_LONG_LONG_INT 1
+
+#elif _MSC_VER >= 1200
+
+/* Temporarily disable wider-than-pointer integers until they're tested more.
+   Build with CFLAGS='-DWIDE_EMACS_INT' to try them out.  */
+
+# ifdef WIDE_EMACS_INT
+
+/* Use pre-C99-style 64-bit integers.  */
+typedef __int64 EMACS_INT;
+typedef unsigned __int64 EMACS_UINT;
+# define EMACS_INT_MAX _I64_MAX
+# define pI "I64"
+
+# endif
+
+#endif
 
 /* We need a little extra space, see ../../lisp/loadup.el.  */
 #define SYSTEM_PURESIZE_EXTRA 50000
 
+#define DATA_START     get_data_start ()
+
 /* For unexec to work on Alpha systems, we need to put Emacs'
    initialized data into a separate section from the CRT initialized
    data (because the Alpha linker freely reorders data variables, even
@@ -390,7 +418,7 @@ extern char *get_emacs_configuration_options (void);
    removed.  Also, obviously, all files that define initialized data
    must include config.h to pick up this pragma.  */
 
-/* Names must be < 8 bytes */
+/* Names must be < 8 bytes */
 #ifdef _MSC_VER
 #pragma data_seg("EMDATA")
 #pragma bss_seg("EMBSS")
@@ -406,8 +434,4 @@ extern void _DebPrint (const char *fmt, ...);
 #define DebPrint(stuff)
 #endif
 
-
 /* ============================================================ */
-
-/* arch-tag: 5d4a3a1c-40dc-4dea-9c7c-38fed9ae0eae
-   (do not change this comment) */