Adapt Windows port to recent changes in autogen/config.in.
[bpt/emacs.git] / src / s / ms-w32.h
index d533ae3..ca4c100 100644 (file)
@@ -27,6 +27,8 @@ 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.  */
 #define _VARARGS_ __cdecl
@@ -36,23 +38,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
    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 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 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
@@ -61,14 +50,21 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
    for received packets, so datagrams are broken too.  */
 #define BROKEN_DATAGRAM_SOCKETS 1
 
-#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 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
 
-#define ORDINARY_LINK 1
+#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
+#define HAVE___BUILTIN_UNWIND_INIT 1
+#endif
 
 /* ============================================================ */
 
@@ -85,6 +81,46 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define IS_DIRECTORY_SEP(_c_) ((_c_) == '/' || (_c_) == '\\')
 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_) || IS_DEVICE_SEP (_c_))
 
+#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
@@ -101,83 +137,10 @@ struct sigaction {
 #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
-
-#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
-#define HAVE_PWD_H 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_MEMCMP 1
-#define HAVE_MEMCPY 1
-#define HAVE_MEMMOVE 1
-#define HAVE_MEMSET 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
-#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 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
@@ -229,6 +192,7 @@ struct sigaction {
 #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
@@ -286,12 +250,27 @@ typedef int pid_t;
 #define stricmp   _stricmp
 #define tzset     _tzset
 
+/* 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
 
+/* '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__
@@ -338,6 +317,13 @@ 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 emacs
 #define malloc e_malloc
@@ -351,6 +337,16 @@ extern char *get_emacs_configuration_options (void);
 #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.  */
@@ -363,17 +359,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
@@ -406,5 +427,4 @@ extern void _DebPrint (const char *fmt, ...);
 #define DebPrint(stuff)
 #endif
 
-
 /* ============================================================ */