XEmacs 21.2.39 "Millennium".
[chise/xemacs-chise.git.1] / src / s / windowsnt.h
index ebbcf69..985dbe3 100644 (file)
@@ -1,4 +1,4 @@
-/* System description file for Windows NT.
+/* System description file for Windows 9x and NT.
    Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
    Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -20,12 +20,73 @@ Boston, MA 02111-1307, USA.  */
 
 /* Synched up with: FSF 19.31. */
 
 
 /* Synched up with: FSF 19.31. */
 
-#ifndef WINDOWSNT
-#define WINDOWSNT
-#endif
-
-#ifndef DOS_NT
-#define DOS_NT         /* MSDOS or WINDOWSNT */
+/* Capsule summary of different preprocessor flags:
+
+1. Keep in mind that there are two possible OS environments we are dealing
+   with -- Cygwin and Native Windows.  Cygwin provides a POSIX emulation
+   layer on top of MS Windows -- in particular, providing the file-system,
+   process, tty, and signal semantics that are part of a modern, standard
+   Unix operating system.  MS Windows also provides these services, but
+   through their own API, called Win32.  When compiling in a Cygwin
+   environment, the Win32 API's are also available, and in fact are used
+   to do native GUI programming.
+
+2. There are two windowing environments we can target XEmacs for when
+   running under MS Windows -- Windows native, and X. (It may seem strange
+   to write an X application under Windows, but there are in fact many X
+   servers out there running on Windows, and as far as I know there is no
+   real (or at least, that works well) networking Window-system extension
+   under MS Windows.  Furthermore, if you're porting a Unix application to
+   Windows and use Cygwin to assist you, it might seem natural to use an
+   X server to avoid having to port all the code to Windows.) For XEmacs,
+   there are various reasons people could come up with for why we would
+   want to keep maintaining X Windows under MS Windows support.
+
+That gives us four possible build environments.  I (Ben) build
+regularly on fully-native-everything, Andy builds on Cygwin + MS
+Windows + X Windows for windowing.
+
+The build flags used for these divisions are:
+
+CYGWIN -- for Cygwin-only stuff.
+WIN32_NATIVE -- Win32 native OS-level stuff (files, process, etc.).
+HAVE_X_WINDOWS -- for X Windows (regardless of whether under MS Win)
+HAVE_MS_WINDOWS -- MS Windows native windowing system (anything related to
+                   the appearance of the graphical screen).
+
+Finally, there's also the MINGW build environment, which uses GCC
+\(similar to Cygwin), but native MS Windows libraries rather than a
+POSIX emulation layer (the Cygwin approach).  This environment defines
+WIN32_NATIVE, but also defines MINGW, which is used mostly because
+uses its own include files (related to Cygwin), which have a few
+things messed up.
+
+
+Formerly, we had a whole host of flags.  Here's the conversion, for porting
+code from GNU Emacs and such:
+
+
+WINDOWSNT -> WIN32_NATIVE
+WIN32 -> WIN32_NATIVE
+_WIN32 -> WIN32_NATIVE
+HAVE_WIN32 -> WIN32_NATIVE
+DOS_NT -> WIN32_NATIVE
+HAVE_NTGUI -> WIN32_NATIVE, unless it ends up already bracketed by this
+HAVE_FACES -> always true
+MSDOS -> determine whether this code is really specific to MS-DOS (and not
+         Windows -- e.g. DJGPP code); if so, delete the code; otherwise,
+         convert to WIN32_NATIVE (we do not support MS-DOS w/DOS Extender
+         under XEmacs)
+
+__CYGWIN__ -> CYGWIN
+__CYGWIN32__ -> CYGWIN
+__MINGW32__ -> MINGW
+
+*/
+
+/* Identify ourselves */
+#ifndef WIN32_NATIVE
+#define WIN32_NATIVE
 #endif
 
 /* In case non-Microsoft compiler is used, we fake _MSC_VER */
 #endif
 
 /* In case non-Microsoft compiler is used, we fake _MSC_VER */
@@ -58,7 +119,7 @@ typedef int pid_t;
 #define SIZEOF_SHORT 2
 #define SIZEOF_INT 4
 #define SIZEOF_LONG 4
 #define SIZEOF_SHORT 2
 #define SIZEOF_INT 4
 #define SIZEOF_LONG 4
-#define SIZEOF_LONG_LONG 8
+#define SIZEOF_LONG_LONG 0
 #define SIZEOF_VOID_P 4
 
 /* NOMULTIPLEJOBS should be defined if your system's shell
 #define SIZEOF_VOID_P 4
 
 /* NOMULTIPLEJOBS should be defined if your system's shell
@@ -105,9 +166,9 @@ typedef int pid_t;
    The alternative is that a lock file named
    /usr/spool/mail/$USER.lock.  */
 
    The alternative is that a lock file named
    /usr/spool/mail/$USER.lock.  */
 
-/* #define MAIL_USE_FLOCK */
 #define MAIL_USE_POP
 #define MAIL_USE_POP
-#define MAIL_USE_SYSTEM_LOCK
+#define HAVE_LOCKING
+#define MAIL_USE_LOCKING
 
 /* If the character used to separate elements of the executable path
    is not ':', #define this to be the appropriate character constant.  */
 
 /* If the character used to separate elements of the executable path
    is not ':', #define this to be the appropriate character constant.  */
@@ -167,13 +228,6 @@ typedef int pid_t;
 #define HAVE_H_ERRNO
 #define HAVE_STRUCT_UTIMBUF
 
 #define HAVE_H_ERRNO
 #define HAVE_STRUCT_UTIMBUF
 
-#ifdef HAVE_NTGUI
-#define HAVE_WINDOW_SYSTEM
-#define HAVE_FACES
-#endif
-
-#define HAVE_STRCASECMP
-
 /* Compatibility macros. Some used to be routines in nt.c */
 #define strcasecmp(x,y) _stricmp(x,y)
 #define random() (rand() << 15 | rand())
 /* Compatibility macros. Some used to be routines in nt.c */
 #define strcasecmp(x,y) _stricmp(x,y)
 #define random() (rand() << 15 | rand())
@@ -182,49 +236,15 @@ typedef int pid_t;
 
 #define MODE_LINE_BINARY_TEXT(_b_) (NILP ((_b_)->buffer_file_type) ? "T" : "B")
 
 
 #define MODE_LINE_BINARY_TEXT(_b_) (NILP ((_b_)->buffer_file_type) ? "T" : "B")
 
-/* get some redefinitions in place */
-
-#if 0
-/* IO calls that are emulated or shadowed */
-#define access  sys_access
-#define chdir   sys_chdir
-#define chmod   sys_chmod
-#define close   sys_close
-#define creat   sys_creat
-#define ctime sys_ctime
-#define dup     sys_dup
-#define dup2    sys_dup2
-#define fopen   sys_fopen
-#define link    sys_link
-#define mktemp  sys_mktemp
-#define open    sys_open
-#define read    sys_read
-#define rename  sys_rename
-#define unlink  sys_unlink
-#define write   sys_write
-#define mkdir   sys_mkdir
-#define rmdir   sys_rmdir
-
-#endif
-
-#if 0
-/* 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__
-#endif
-#include <direct.h>
-#include <io.h>
-#include <stdio.h>
-#ifdef MUST_UNDEF__STDC__
-#undef __STDC__
-#undef MUST_UNDEF__STDC__
-#endif
-#endif
 
 #include <stdio.h>
 
 
 #include <stdio.h>
 
+/* subprocess calls that are emulated */
+#ifndef DONT_ENCAPSULATE
+#define spawnve sys_spawnve
+int spawnve (int mode, const char *cmdname, 
+            const char * const *argv, const char *const *envp);
+#endif
 
 /* IO calls that are emulated or shadowed */
 #define pipe    sys_pipe
 
 /* IO calls that are emulated or shadowed */
 #define pipe    sys_pipe
@@ -235,11 +255,6 @@ int sys_pipe (int * phandles);
 void sleep (int seconds);
 #endif
 
 void sleep (int seconds);
 #endif
 
-/* subprocess calls that are emulated */
-#define spawnve sys_spawnve
-int spawnve (int mode, CONST char *cmdname, 
-            CONST char * CONST *argv, CONST char *CONST *envp);
-
 #define wait    sys_wait
 int wait (int *status);
 
 #define wait    sys_wait
 int wait (int *status);
 
@@ -250,37 +265,6 @@ int kill (int pid, int sig);
 #define popen     _popen
 #define pclose    _pclose
 
 #define popen     _popen
 #define pclose    _pclose
 
-#if 0
-#define chdir     _chdir
-#define execlp    _execlp
-#define execvp    _execvp
-#define fcloseall _fcloseall
-#define fdopen    _fdopen
-#define fgetchar  _fgetchar
-#define fileno    _fileno
-#define flushall  _flushall
-#define fputchar  _fputchar
-#define getw      _getw
-#define getpid    _getpid
-#define isatty    _isatty
-#define logb      _logb
-#define _longjmp  longjmp
-#define lseek     _lseek
-#define putw      _putw
-#define umask     _umask
-/* #define utime     _utime */
-/* #define index     strchr */
-/* #define rindex    strrchr */
-#define read     _read
-#define write    _write
-#define getcwd    _getcwd
-
-#ifdef HAVE_NTGUI
-#define abort  win32_abort
-#endif
-
-#endif /* 0 */
-
 typedef int uid_t;
 typedef int gid_t;
 typedef int pid_t;
 typedef int uid_t;
 typedef int gid_t;
 typedef int pid_t;
@@ -316,11 +300,10 @@ gid_t getegid (void);
 
 /* We now have emulation for some signals */
 #define HAVE_SIGHOLD
 
 /* We now have emulation for some signals */
 #define HAVE_SIGHOLD
-#define sigset(s,h) msw_sigset(s,h)
-#define sighold(s) msw_sighold(s)
-#define sigrelse(s) msw_sigrelse(s)
-#define sigpause(s) msw_sigpause(s)
-#define signal sigset
+#define sigset(s,h) mswindows_sigset(s,h)
+#define sighold(s) mswindows_sighold(s)
+#define sigrelse(s) mswindows_sigrelse(s)
+#define sigpause(s) mswindows_sigpause(s)
 
 /* Defines that we need that aren't in the standard signal.h  */
 #define SIGHUP  1               /* Hang up */
 
 /* Defines that we need that aren't in the standard signal.h  */
 #define SIGHUP  1               /* Hang up */
@@ -329,17 +312,6 @@ gid_t getegid (void);
 #define SIGALRM 14              /* Alarm */
 #define SIGPROF 29             /* Profiling timer exp */
 
 #define SIGALRM 14              /* Alarm */
 #define SIGPROF 29             /* Profiling timer exp */
 
-/* For integration with MSDOS support.  */
-#define getdisk()               (_getdrive () - 1)
-#define getdefdir(_drv, _buf)   _getdcwd (_drv, _buf, MAXPATHLEN)
-
-#if 0 /* they do. -kkm */
-/* Define this so that winsock.h definitions don't get included when windows.h
-   is...  I don't know if they do the right thing for emacs.  For this to
-   have proper effect, config.h must always be included before windows.h.  */
-#define _WINSOCKAPI_    1
-#endif /* 0 */
-
 /* Defines size_t and alloca ().  */
 #include <malloc.h>
 
 /* Defines size_t and alloca ().  */
 #include <malloc.h>
 
@@ -382,3 +354,26 @@ gid_t getegid (void);
   #define _WIN32_WINNT 0x0400
  #endif
 #endif
   #define _WIN32_WINNT 0x0400
  #endif
 #endif
+
+/* Force the various NT 4 structures and constants to be included; we're
+   careful not to call (or even link with) functions not in NT 3.51 when
+   running on 3.51, but when running on NT 4 or Win9x, we use the later
+   functions, and need their headers. */
+/* The VC++ (5.0, at least) headers treat WINVER non-existent as 0x0400 */
+#if defined (WINVER) && WINVER < 0x0400
+# undef WINVER
+# define WINVER 0x0400
+#endif
+
+/* MSVC 6.0 has a mechanism to declare functions which never return */
+#if (_MSC_VER >= 1200)
+#define DOESNT_RETURN __declspec(noreturn) void
+#define DECLARE_DOESNT_RETURN(decl) __declspec(noreturn) extern void decl
+#define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
+          __declspec(noreturn) extern void decl PRINTF_ARGS(str,idx)
+#endif /* MSVC 6.0 */
+
+#define CORRECT_DIR_SEPS(s) \
+  do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \
+       else unixtodos_filename (s); \
+  } while (0)