summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1994-11-01 10:27:02 +0000
committerRichard M. Stallman <rms@gnu.org>1994-11-01 10:27:02 +0000
commitb806b54d0af3bf1b2bb68eb4806ed3545ac19c3f (patch)
treebeb54470412d29369c4af72d104fff21e9fb9b07
parentb2bb196bf2a68779e6a49092ea4a1cf9e9e3adc3 (diff)
downloademacs-b806b54d0af3bf1b2bb68eb4806ed3545ac19c3f.tar.gz
Initial revision
-rw-r--r--lib-src/makefile.nt326
-rw-r--r--lib-src/ntlib.c90
-rw-r--r--lisp/makefile.nt42
-rw-r--r--lisp/w32-fns.el115
-rw-r--r--src/makefile.nt940
-rw-r--r--src/s/ms-w32.h264
-rw-r--r--src/w32.c610
-rw-r--r--src/w32.h50
-rw-r--r--src/w32heap.c198
-rw-r--r--src/w32heap.h72
10 files changed, 2707 insertions, 0 deletions
diff --git a/lib-src/makefile.nt b/lib-src/makefile.nt
new file mode 100644
index 00000000000..68239dd9a4d
--- /dev/null
+++ b/lib-src/makefile.nt
@@ -0,0 +1,326 @@
+# Makefile for GNU Emacs lib-src directory.
+# Geoff Voelker (voelker@cs.washington.edu)
+# Copyright (C) 1994 Free Software Foundation, Inc.
+#
+# This file is part of GNU Emacs.
+#
+# GNU Emacs is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# 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. */
+#
+
+#
+# Sets up the system dependent macros.
+#
+!include ..\nt\makefile.def
+
+LOCAL_FLAGS = -DWINDOWSNT -DDOS_NT -DSTDC_HEADERS=1 -DNO_LDAV=1 -DNO_ARCHIVES=1 -I..\src
+OBJDIR = obj
+BLD = $(OBJDIR)\$(ARCH)
+
+LINK_FLAGS = $(ARCH_LDFLAGS) -debug:PARTIAL -machine:$(ARCH) -subsystem:console -entry:mainCRTStartup
+
+ALL = $(BLD)\make-docfile.exe \
+ $(BLD)\hexl.exe \
+ $(BLD)\wakeup.exe \
+ $(BLD)\ctags.exe \
+ $(BLD)\etags.exe
+
+
+# don't know what (if) to do with these yet...
+#
+# $(BLD)\sorted-doc.exe \
+# $(BLD)\env.exe \
+# $(BLD)\server.exe \
+# $(BLD)\emacstool.exe \
+# $(BLD)\fakemail.exe \
+# $(BLD)\leditcfns.exe \
+# $(BLD)\movemail.exe \
+# $(BLD)\emacsclient.exe \
+# $(BLD)\cvtmail.exe \
+# $(BLD)\digest-doc.exe \
+# $(BLD)\test-distrib.exe \
+
+
+LIBS = $(SYS_LIB_DIR)\setargv.obj \
+ $(SYS_LIB_DIR)\kernel32.lib \
+ $(SYS_LIB_DIR)\libc.lib
+
+# $(SYS_LIB_DIR)\advapi32.lib \
+
+$(BLD)\make-docfile.exe: $(LIBS) $(BLD)\make-docfile.obj
+$(BLD)\hexl.exe: $(LIBS) $(BLD)\hexl.obj
+$(BLD)\ctags.exe: $(BLD)\etags.exe
+ copy $(BLD)\etags.exe $(BLD)\ctags.exe
+$(BLD)\wakeup.exe: $(LIBS) $(BLD)\wakeup.obj $(BLD)\ntlib.obj
+ $(LINK) -out:$@ $(LINK_FLAGS) $(BLD)\wakeup.obj $(BLD)\ntlib.obj $(LIBS)
+
+make-docfile: $(BLD)\make-docfile.exe
+wakeup: $(BLD)\wakeup.exe
+etags: $(BLD)\etags.exe
+hexl: $(BLD)\hexl.exe
+
+ETAGSOBJ = $(BLD)\etags.obj \
+ $(BLD)\getopt.obj \
+ $(BLD)\getopt1.obj \
+ $(BLD)\ntlib.obj
+
+$(BLD)\etags.exe: $(LIBS) $(ETAGSOBJ)
+ link32 -out:$@ -debug:PARTIAL -machine:$(ARCH) -align:0x1000 -subsystem:console -entry:mainCRTStartup $(ETAGSOBJ) $(LIBS)
+
+#
+# don't know what to do with these yet...
+#
+# $(BLD)\sorted-doc.exe: $(LIBS) $(BLD)\sorted-doc.obj
+# $(BLD)\yow.exe: $(LIBS) $(BLD)\yow.obj
+# $(BLD)\emacstool.exe: $(LIBS) $(BLD)\emacstool.obj
+# $(BLD)\env.exe: $(LIBS) $(BLD)\env.obj
+# $(BLD)\fakemail.exe: $(LIBS) $(BLD)\fakemail.obj
+# $(BLD)\leditcfns.exe: $(LIBS) $(BLD)\leditcfns.obj
+# $(BLD)\server.exe: $(LIBS) $(BLD)\server.obj
+# $(BLD)\wakeup.exe: $(LIBS) $(BLD)\wakeup.obj
+# $(BLD)\movemail.exe: $(LIBS) $(BLD)\movemail.obj
+# $(BLD)\cvtmail.exe: $(LIBS) $(BLD)\cvtmail.obj
+# $(BLD)\digest-doc.exe: $(LIBS) $(BLD)\digest-doc.obj
+# $(BLD)\emacsclient.exe: $(LIBS) $(BLD)\emacsclient.obj
+# $(BLD)\qsort.exe: $(LIBS) $(BLD)\qsort.obj
+# $(BLD)\test-distrib.exe: $(LIBS) $(BLD)\test-distrib.obj
+
+#
+# From ..\makefile.nt, with .obj changed to .o
+#
+obj = abbrev.o alloc.o alloca.o buffer.o bytecode.o callint.o callproc.o casefiddle.o cm.o cmds.o data.o dired.o dispnew.o doc.o doprnt.o editfns.o eval.o fileio.o filelock.o filemode.o fns.o indent.o insdel.o keyboard.o keymap.o lastfile.o lread.o macros.o marker.o minibuf.o xfaces.o mocklisp.o nt.o ntheap.o ntinevt.o ntproc.o ntterm.o print.o process.o regex.o scroll.o search.o syntax.o sysdep.o term.o termcap.o tparam.o undo.o unexnt.o window.o xdisp.o casetab.o floatfns.o frame.o gmalloc.o intervals.o ralloc.o textprop.o vm-limit.o
+
+lispdir = ..\lisp
+
+#
+# These are the lisp files that are loaded up in loadup.el
+#
+lisp= \
+ $(lispdir)\subr.elc \
+ $(lispdir)\byte-run.elc \
+ $(lispdir)\map-ynp.elc \
+ $(lispdir)\loaddefs.el \
+ $(lispdir)\simple.elc \
+ $(lispdir)\help.elc \
+ $(lispdir)\files.elc \
+ $(lispdir)\indent.elc \
+ $(lispdir)\window.elc \
+ $(lispdir)\frame.elc \
+ $(lispdir)\mouse.elc \
+ $(lispdir)\menu-bar.elc \
+ $(lispdir)\scroll-bar.elc \
+ $(lispdir)\select.elc \
+ $(lispdir)\paths.el \
+ $(lispdir)\startup.elc \
+ $(lispdir)\lisp.elc \
+ $(lispdir)\page.elc \
+ $(lispdir)\register.elc \
+ $(lispdir)\paragraphs.elc \
+ $(lispdir)\lisp-mode.elc \
+ $(lispdir)\text-mode.elc \
+ $(lispdir)\fill.elc \
+ $(lispdir)\c-mode.elc \
+ $(lispdir)\isearch.elc \
+ $(lispdir)\replace.elc \
+ $(lispdir)\abbrev.elc \
+ $(lispdir)\buff-menu.elc \
+ $(lispdir)\winnt.elc \
+ $(lispdir)\float-sup.elc \
+ $(lispdir)\vc-hooks.elc \
+ $(lispdir)\version.el
+
+DOC = DOC
+$(DOC): $(BLD)\make-docfile.exe
+ - rm -f $(DOC)
+ $(BLD)\make-docfile -d ..\src $(obj) > $(DOC)
+ $(BLD)\make-docfile -d ..\src $(lisp) >> $(DOC)
+ $(CP) $(DOC) ..\etc
+ - mkdir ..\src\$(OBJDIR)
+ - mkdir ..\src\$(OBJDIR)\etc
+ $(CP) $(DOC) ..\src\$(OBJDIR)\etc
+
+{$(BLD)}.obj{$(BLD)}.exe:
+ $(LINK) -out:$@ $(LINK_FLAGS) $*.obj $(LIBS)
+
+.c{$(BLD)}.obj:
+ $(CC) $(CFLAGS) -Fo$@ $<
+
+#
+# Build the executables
+#
+all: $(BLD) $(ALL) $(DOC)
+
+#
+# Assuming INSTALL_DIR is defined, build and install emacs in it.
+#
+INSTALL_FILES = $(ALL)
+install: $(INSTALL_FILES)
+ - mkdir $(INSTALL_DIR)\bin
+ $(CP) $(BLD)\etags.exe $(INSTALL_DIR)\bin
+ $(CP) $(BLD)\ctags.exe $(INSTALL_DIR)\bin
+ $(CP) $(BLD)\hexl.exe $(INSTALL_DIR)\bin
+ $(CP) $(BLD)\wakeup.exe $(INSTALL_DIR)\bin\wakeup
+ - mkdir $(INSTALL_DIR)\etc
+ $(CP) $(DOC) $(INSTALL_DIR)\etc
+
+#
+# Maintenance
+#
+clean:; - del /q *~
+ - delnode /q deleted
+ - delnode /q obj
+ - del /q DOC
+
+#
+# Headers we would preprocess if we could.
+#
+..\src\config.h: ..\nt\src\config.h
+ cp ..\nt\src\config.h ..\src\config.h
+..\src\paths.h: ..\nt\src\paths.h
+ cp ..\nt\src\paths.h ..\src\paths.h
+
+### DEPENDENCIES ###
+
+EMACS_ROOT = ..
+SRC = .
+
+$(BLD)\alloca.obj : \
+ $(SRC)\alloca.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(EMACS_ROOT)\src\blockinput.h
+
+$(BLD)\b2m.obj : \
+ $(SRC)\b2m.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h
+
+$(BLD)\cvtmail.obj : \
+ $(SRC)\cvtmail.c
+
+$(BLD)\digest-doc.obj : \
+ $(SRC)\digest-doc.c
+
+$(BLD)\emacsclient.obj : \
+ $(SRC)\emacsclient.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h
+
+$(BLD)\emacsserver.obj : \
+ $(SRC)\emacsserver.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h
+
+$(BLD)\emacstool.obj : \
+ $(SRC)\emacstool.c \
+ $(EMACS_ROOT)\nt\inc\sys\file.h
+
+$(BLD)\etags.obj : \
+ $(SRC)\etags.c \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h \
+ $(SRC)\getopt.h
+
+$(BLD)\fakemail.obj : \
+ $(SRC)\fakemail.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h \
+ $(EMACS_ROOT)\nt\inc\pwd.h
+
+$(BLD)\getdate.obj : \
+ $(SRC)\getdate.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(MSTOOLS_SYS)\types.h
+
+$(BLD)\getopt.obj : \
+ $(SRC)\getopt.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\getopt.h
+
+$(BLD)\getopt1.obj : \
+ $(SRC)\getopt1.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\getopt.h
+
+$(BLD)\hexl.obj : \
+ $(SRC)\hexl.c
+
+$(BLD)\leditcfns.obj : \
+ $(SRC)\leditcfns.c
+
+$(BLD)\make-docfile.obj : \
+ $(SRC)\make-docfile.c
+
+$(BLD)\make-path.obj : \
+ $(SRC)\make-path.c
+
+$(BLD)\movemail.obj : \
+ $(SRC)\movemail.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(EMACS_ROOT)\src\vmsproc.h \
+ $(EMACS_ROOT)\lib-src\..\src\syswait.h \
+ $(EMACS_ROOT)\nt\inc\pwd.h
+
+$(BLD)\profile.obj : \
+ $(SRC)\profile.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h \
+ $(EMACS_ROOT)\src\vmstime.h \
+ $(EMACS_ROOT)\lib-src\..\src\systime.h
+
+$(BLD)\qsort.obj : \
+ $(SRC)\qsort.c
+
+$(BLD)\sorted-doc.obj : \
+ $(SRC)\sorted-doc.c
+
+$(BLD)\tcp.obj : \
+ $(SRC)\tcp.c
+
+$(BLD)\test-distrib.obj : \
+ $(SRC)\test-distrib.c
+
+$(BLD)\timer.obj : \
+ $(SRC)\timer.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\lib-src\..\src\config.h
+
+$(BLD)\wakeup.obj : \
+ $(SRC)\wakeup.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h
+
+$(BLD)\yow.obj : \
+ $(SRC)\yow.c \
+ $(EMACS_ROOT)\lib-src\..\src\paths.h
diff --git a/lib-src/ntlib.c b/lib-src/ntlib.c
new file mode 100644
index 00000000000..1e1fc86798f
--- /dev/null
+++ b/lib-src/ntlib.c
@@ -0,0 +1,90 @@
+/* Utility and Unix shadow routines for GNU Emacs support programs on NT.
+ Copyright (C) 1994 Free Software Foundation, Inc.
+
+ This file is part of GNU Emacs.
+
+ GNU Emacs is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ GNU Emacs is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the 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.
+
+ Geoff Voelker (voelker@cs.washington.edu) 10-8-94
+*/
+
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define MAXPATHLEN _MAX_PATH
+
+/* Emulate sleep...we could have done this with a define, but that
+ would necessitate including windows.h in the files that used it.
+ This is much easier. */
+void
+nt_sleep(int seconds)
+{
+ Sleep (seconds * 1000);
+}
+
+/* Get the current working directory. */
+int
+getwd (char *dir)
+{
+ return GetCurrentDirectory (MAXPATHLEN, dir);
+}
+
+static HANDLE getppid_parent;
+static int getppid_ppid;
+
+int
+getppid(void)
+{
+ char *ppid;
+ DWORD result;
+
+ ppid = getenv ("__PARENT_PROCESS_ID");
+ if (!ppid)
+ {
+ printf("no pid.\n");
+ return 0;
+ }
+ else
+ {
+ getppid_ppid = atoi (ppid);
+ }
+
+ if (!getppid_parent)
+ {
+ getppid_parent = OpenProcess (SYNCHRONIZE, FALSE, atoi(ppid));
+ if (!getppid_parent)
+ {
+ printf ("Failed to open handle to parent process: %d\n",
+ GetLastError());
+ exit (1);
+ }
+ }
+
+ result = WaitForSingleObject (getppid_parent, 0);
+ switch (result)
+ {
+ case WAIT_TIMEOUT:
+ /* The parent is still alive. */
+ return getppid_ppid;
+ case WAIT_OBJECT_0:
+ /* The parent is gone. Return the pid of Unix init (1). */
+ return 1;
+ case WAIT_FAILED:
+ default:
+ printf ("Checking parent status failed: %d\n", GetLastError());
+ exit (1);
+ }
+}
diff --git a/lisp/makefile.nt b/lisp/makefile.nt
new file mode 100644
index 00000000000..61246b8e104
--- /dev/null
+++ b/lisp/makefile.nt
@@ -0,0 +1,42 @@
+# Hacked up Nmake makefile for GNU Emacs
+# Geoff Voelker (voelker@cs.washington.edu)
+# Copyright (c) 1994 Free Software Foundation, Inc.
+#
+# This file is part of GNU Emacs.
+#
+# GNU Emacs is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# 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. */
+#
+
+!include ..\nt\makefile.def
+
+all:
+
+#
+# Assuming INSTALL_DIR is defined, copy the elisp files to it
+#
+install:; - mkdir $(INSTALL_DIR)\lisp
+ - del /q .\same-dir.tst
+ - del /q $(INSTALL_DIR)\lisp\same-dir.tst
+ echo SameDirTest > .\same-dir.tst
+ if not exist $(INSTALL_DIR)\lisp\same-dir.tst $(CP_DIR) . $(INSTALL_DIR)\lisp
+ - del /q .\same-dir.tst
+
+
+#
+# Maintenance
+#
+clean:; - del /q *~
+ - delnode /q deleted
+
diff --git a/lisp/w32-fns.el b/lisp/w32-fns.el
new file mode 100644
index 00000000000..388a5dd8818
--- /dev/null
+++ b/lisp/w32-fns.el
@@ -0,0 +1,115 @@
+;; winnt.el --- Lisp routines for Windows NT.
+;; Copyright (C) 1994 Free Software Foundation, Inc.
+
+;; Author: Geoff Voelker (voelker@cs.washington.edu)
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; 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.
+
+;;; Commentary:
+
+;; (August 12, 1993)
+;; NT switches placed in:
+;;
+;; compile.el, dired-new.el, dired.el, loadup.el, startup.el, subr.el
+
+;; (November 21, 1993)
+;; General stuffing for supporting Windows NT.
+
+;;; Code:
+
+;; Map delete and backspace
+(define-key function-key-map [backspace] "\177")
+(define-key function-key-map [delete] "\C-d")
+(define-key function-key-map [M-backspace] [?\M-\177])
+
+;; Ignore case on file-name completion
+(setq completion-ignore-case t)
+
+;; The cmd.exe shell uses the "/c" switch instead of the "-c" switch
+;; for executing its command line argument (from simple.el).
+(setq shell-command-switch "/c")
+
+;; Taken from dos-fn.el ... don't want all that's in the file, maybe
+;; separate it out someday.
+
+(defvar file-name-buffer-file-type-alist
+ '(
+ ("[:/].*config.sys$" . nil) ; config.sys text
+ ("\\.elc$" . t) ; emacs stuff
+ ("\\.\\(obj\\|exe\\|com\\|lib\\|sys\\|chk\\|out\\|bin\\|ico\\|pif\\)$" . t)
+ ; MS-Dos stuff
+ ("\\.\\(arc\\|zip\\|pak\\|lzh\\|zoo\\)$" . t)
+ ; Packers
+ ("\\.\\(a\\|o\\|tar\\|z\\|gz\\|taz\\)$" . t)
+ ; Unix stuff
+ ("\\.tp[ulpw]$" . t)
+ ; Borland Pascal stuff
+ ("[:/]tags$" . t)
+ ; Emacs TAGS file
+ )
+ "*Alist for distinguishing text files from binary files.
+Each element has the form (REGEXP . TYPE), where REGEXP is matched
+against the file name, and TYPE is nil for text, t for binary.")
+
+(defun find-buffer-file-type (filename)
+ (let ((alist file-name-buffer-file-type-alist)
+ (found nil)
+ (code nil))
+ (let ((case-fold-search t))
+ (setq filename (file-name-sans-versions filename))
+ (while (and (not found) alist)
+ (if (string-match (car (car alist)) filename)
+ (setq code (cdr (car alist))
+ found t))
+ (setq alist (cdr alist))))
+ (if found
+ (cond((memq code '(nil t)) code)
+ ((and (symbolp code) (fboundp code))
+ (funcall code filename)))
+ default-buffer-file-type)))
+
+(defun find-file-binary (filename)
+ "Visit file FILENAME and treat it as binary."
+ (interactive "FFind file binary: ")
+ (let ((file-name-buffer-file-type-alist '(("" . t))))
+ (find-file filename)))
+
+(defun find-file-text (filename)
+ "Visit file FILENAME and treat it as a text file."
+ (interactive "FFind file text: ")
+ (let ((file-name-buffer-file-type-alist '(("" . nil))))
+ (find-file filename)))
+
+(defun find-file-not-found-set-buffer-file-type ()
+ (save-excursion
+ (set-buffer (current-buffer))
+ (setq buffer-file-type (find-buffer-file-type (buffer-file-name))))
+ nil)
+
+;;; To set the default file type on new files.
+(add-hook 'find-file-not-found-hooks 'find-file-not-found-set-buffer-file-type)
+
+;;; Fix interface to (X-specific) mouse.el
+(defalias 'window-frame 'ignore)
+(defalias 'x-set-selection 'ignore)
+(fset 'x-get-selection '(lambda (&rest rest) ""))
+(fmakunbound 'font-menu-add-default)
+(global-unset-key [C-down-mouse-1])
+(global-unset-key [C-down-mouse-2])
+(global-unset-key [C-down-mouse-3])
+
+;;; winnt.el ends here
diff --git a/src/makefile.nt b/src/makefile.nt
new file mode 100644
index 00000000000..ade4184e5b4
--- /dev/null
+++ b/src/makefile.nt
@@ -0,0 +1,940 @@
+# Makefile for GNU Emacs on Windows NT
+# Copyright (c) 1992, 1993, 1994 Free Software Foundation, Inc.
+# Tim Fleehart (apollo@online.com)
+# Geoff Voelker (voelker@cs.washington.edu)
+#
+# This file is part of GNU Emacs.
+#
+# GNU Emacs is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# 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. */
+#
+
+#
+# Sets up the system dependent macros.
+#
+!include ..\nt\makefile.def
+
+#
+# HAVE_CONFIG_H is required by some generic gnu sources stuck into
+# the emacs source tree.
+#
+LOCAL_FLAGS = -Demacs=1 -DWINDOWSNT -DDOS_NT -DHAVE_CONFIG_H -I..\nt\inc -Zi
+
+EMACS = $(BLD)\emacs.exe
+TEMACS = $(BLD)\temacs.exe
+TLIB = $(BLD)\temacs.lib
+TOBJ = $(BLD)\emacs.obj
+
+LINK_FLAGS = $(ARCH_LDFLAGS) -stack:0x1000000 -base:0xD00000 -debug:full -debugtype:cv -machine:$(ARCH) -subsystem:console -entry:_start
+
+# -debug:PARTIAL -debugtype:COFF
+
+#
+# Split up the objects into two sets so that we don't run out of
+# command line space when we link them into a library.
+#
+OBJ1 = $(BLD)\abbrev.obj \
+ $(BLD)\alloc.obj \
+ $(BLD)\alloca.obj \
+ $(BLD)\buffer.obj \
+ $(BLD)\bytecode.obj \
+ $(BLD)\callint.obj \
+ $(BLD)\callproc.obj \
+ $(BLD)\casefiddle.obj \
+ $(BLD)\cm.obj \
+ $(BLD)\cmds.obj \
+ $(BLD)\data.obj \
+ $(BLD)\dired.obj \
+ $(BLD)\dispnew.obj \
+ $(BLD)\doc.obj \
+ $(BLD)\doprnt.obj \
+ $(BLD)\editfns.obj \
+ $(BLD)\eval.obj \
+ $(BLD)\fileio.obj \
+ $(BLD)\filelock.obj \
+ $(BLD)\filemode.obj \
+ $(BLD)\fns.obj \
+ $(BLD)\indent.obj \
+ $(BLD)\insdel.obj \
+ $(BLD)\keyboard.obj \
+ $(BLD)\keymap.obj \
+ $(BLD)\lastfile.obj \
+ $(BLD)\lread.obj \
+ $(BLD)\macros.obj \
+ $(BLD)\marker.obj \
+ $(BLD)\minibuf.obj \
+ $(BLD)\xfaces.obj \
+ $(BLD)\mocklisp.obj
+
+OBJ2 = $(BLD)\nt.obj \
+ $(BLD)\ntheap.obj \
+ $(BLD)\ntinevt.obj \
+ $(BLD)\ntproc.obj \
+ $(BLD)\ntterm.obj \
+ $(BLD)\print.obj \
+ $(BLD)\process.obj \
+ $(BLD)\regex.obj \
+ $(BLD)\scroll.obj \
+ $(BLD)\search.obj \
+ $(BLD)\syntax.obj \
+ $(BLD)\sysdep.obj \
+ $(BLD)\term.obj \
+ $(BLD)\termcap.obj \
+ $(BLD)\tparam.obj \
+ $(BLD)\undo.obj \
+ $(BLD)\unexnt.obj \
+ $(BLD)\window.obj \
+ $(BLD)\xdisp.obj \
+ $(BLD)\casetab.obj \
+ $(BLD)\floatfns.obj \
+ $(BLD)\frame.obj \
+ $(BLD)\gmalloc.obj \
+ $(BLD)\intervals.obj \
+ $(BLD)\ralloc.obj \
+ $(BLD)\textprop.obj \
+ $(BLD)\vm-limit.obj
+
+LIBS = $(TLIB) \
+ $(SYS_LIB_DIR)\setargv.obj \
+ $(SYS_LIB_DIR)\kernel32.lib \
+ $(SYS_LIB_DIR)\advapi32.lib \
+ $(SYS_LIB_DIR)\libc.lib
+
+#
+# Build the executable and dump it.
+#
+all: $(BLD) $(EMACS)
+
+#
+# Headers we would preprocess if we could.
+#
+PREPARED_HEADERS = config.h paths.h
+config.h: ..\nt\src\config.h
+ cp ..\nt\src\config.h config.h
+paths.h: ..\nt\src\paths.h
+ cp ..\nt\src\paths.h paths.h
+
+#
+# The dumped executable
+#
+emacs: $(EMACS)
+$(EMACS): $(PREPARED_HEADERS) $(TEMACS)
+ cd $(BLD)
+ temacs.exe -batch -l loadup dump
+ cd ..\..
+
+#
+# The undumped executable
+#
+temacs: $(BLD) $(TEMACS)
+$(TEMACS): $(LIBS) $(TOBJ)
+ $(LINK) -out:$(TEMACS) $(LINK_FLAGS) $(TOBJ) $(LIBS)
+
+#
+# Build the library. Split up the build into two phases...otherwise we
+# run out of command line space.
+#
+$(TLIB): $(OBJ1) $(OBJ2)
+ @- $(AR) -out:$(TLIB) $(OBJ1)
+ @- $(AR) -out:$(TLIB) $(TLIB) $(OBJ2)
+
+#
+# Object files.
+#
+.c{$(BLD)}.obj:
+ $(CC) $(CFLAGS) -Fo$@ $<
+
+#
+# Assuming INSTALL_DIR is defined, build and install emacs in it.
+#
+install: all
+ - mkdir $(INSTALL_DIR)\bin
+ $(CP) $(EMACS) $(INSTALL_DIR)\bin
+
+#
+# Maintenance
+#
+clean:; - del /q *~
+ - delnode /q deleted
+ - delnode /q obj
+
+#
+# These files are the ones that compile conditionally on CANNOT_DUMP...
+# this target is mostly used for debugging.
+#
+cleandump:; cd $(BLD) && - del callproc.obj data.obj dispnew.obj doc.obj editfns.obj emacs.obj lread.obj process.obj sysdep.obj term.obj ntheap.obj unexnt.obj
+
+
+### DEPENDENCIES ###
+
+EMACS_ROOT = ..
+SRC = .
+
+$(BLD)\abbrev.obj : \
+ $(SRC)\abbrev.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\window.h
+
+$(BLD)\alloc.obj : \
+ $(SRC)\alloc.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\puresize.h \
+ $(SRC)\buffer.h \
+ $(SRC)\window.h \
+ $(SRC)\frame.h \
+ $(SRC)\blockinput.h \
+ $(SRC)\syssignal.h
+
+$(BLD)\alloca.obj : \
+ $(SRC)\alloca.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(SRC)\blockinput.h
+
+$(BLD)\buffer.obj : \
+ $(SRC)\buffer.c \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\window.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\indent.h \
+ $(SRC)\blockinput.h
+
+$(BLD)\bytecode.obj : \
+ $(SRC)\bytecode.c \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\syntax.h
+
+$(BLD)\callint.obj : \
+ $(SRC)\callint.c \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\commands.h \
+ $(SRC)\keyboard.h \
+ $(SRC)\window.h \
+ $(SRC)\mocklisp.h
+
+$(BLD)\callproc.obj : \
+ $(SRC)\callproc.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\msdos.h \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\process.h \
+ $(SRC)\syssignal.h \
+ $(EMACS_ROOT)\nt\inc\sys\ioctl.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\systty.h
+
+$(BLD)\casefiddle.obj : \
+ $(SRC)\casefiddle.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\commands.h \
+ $(SRC)\syntax.h
+ $(CC) $(CFLAGS) -Fo$@ casefiddle.c
+
+$(BLD)\casetab.obj : \
+ $(SRC)\casetab.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h
+
+$(BLD)\cm.obj : \
+ $(SRC)\cm.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\cm.h \
+ $(SRC)\termhooks.h
+
+$(BLD)\cmds.obj : \
+ $(SRC)\cmds.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\syntax.h
+
+$(BLD)\data.obj : \
+ $(SRC)\data.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\puresize.h \
+ $(SRC)\buffer.h \
+ $(SRC)\syssignal.h
+
+$(BLD)\dired.obj : \
+ $(SRC)\dired.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\vmsdir.h \
+ $(SRC)\ndir.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\commands.h \
+ $(SRC)\regex.h
+
+$(BLD)\dispnew.obj : \
+ $(SRC)\dispnew.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\termchar.h \
+ $(SRC)\termopts.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\cm.h \
+ $(SRC)\buffer.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\commands.h \
+ $(SRC)\disptab.h \
+ $(SRC)\indent.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(EMACS_ROOT)\nt\inc\sys\ioctl.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\systty.h \
+ $(SRC)\xterm.h \
+ $(SRC)\vmstime.h \
+ $(SRC)\systime.h
+
+$(BLD)\doc.obj : \
+ $(SRC)\doc.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\keyboard.h
+
+$(BLD)\doprnt.obj : \
+ $(SRC)\doprnt.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h
+
+$(BLD)\dosfns.obj : \
+ $(SRC)\dosfns.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\termchar.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\frame.h \
+ $(SRC)\dosfns.h \
+ $(SRC)\msdos.h
+
+$(BLD)\editfns.obj : \
+ $(SRC)\editfns.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\uaf.h \
+ $(SRC)\vms-pwd.h \
+ $(EMACS_ROOT)\nt\inc\pwd.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\buffer.h \
+ $(SRC)\window.h \
+ $(SRC)\vmstime.h \
+ $(SRC)\systime.h
+
+$(BLD)\emacs.obj : \
+ $(SRC)\emacs.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(EMACS_ROOT)\nt\inc\sys\ioctl.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\systty.h \
+ $(SRC)\syssignal.h \
+ $(SRC)\process.h
+
+$(BLD)\eval.obj : \
+ $(SRC)\eval.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\blockinput.h \
+ $(SRC)\commands.h \
+ $(SRC)\keyboard.h
+
+$(BLD)\fileio.obj : \
+ $(SRC)\fileio.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\uaf.h \
+ $(SRC)\vms-pwd.h \
+ $(EMACS_ROOT)\nt\inc\pwd.h \
+ $(SRC)\msdos.h \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(SRC)\vmsdir.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\buffer.h \
+ $(SRC)\window.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\vmstime.h \
+ $(SRC)\systime.h
+
+$(BLD)\filelock.obj : \
+ $(SRC)\filelock.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\uaf.h \
+ $(SRC)\vms-pwd.h \
+ $(EMACS_ROOT)\nt\inc\pwd.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\lisp.h \
+ $(EMACS_ROOT)\src\paths.h \
+ $(SRC)\buffer.h \
+ $(SRC)\vmsdir.h \
+ $(SRC)\ndir.h
+
+$(BLD)\filemode.obj : \
+ $(SRC)\filemode.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h
+
+$(BLD)\floatfns.obj : \
+ $(SRC)\floatfns.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\syssignal.h
+
+$(BLD)\fns.obj : \
+ $(SRC)\fns.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\keyboard.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h
+
+$(BLD)\frame.obj : \
+ $(SRC)\frame.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\frame.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\window.h \
+ $(SRC)\buffer.h \
+ $(SRC)\commands.h \
+ $(SRC)\keyboard.h
+
+$(BLD)\getloadavg.obj : \
+ $(SRC)\getloadavg.c \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h
+
+$(BLD)\gmalloc.obj : \
+ $(SRC)\gmalloc.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(SRC)\getpagesize.h
+ $(CC) $(CFLAGS) -D__STDC__ -Fo$@ gmalloc.c
+
+$(BLD)\hftctl.obj : \
+ $(SRC)\hftctl.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\ioctl.h
+
+$(BLD)\indent.obj : \
+ $(SRC)\indent.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\indent.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\termchar.h \
+ $(SRC)\termopts.h \
+ $(SRC)\disptab.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h
+
+$(BLD)\insdel.obj : \
+ $(SRC)\insdel.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\buffer.h \
+ $(SRC)\window.h \
+ $(SRC)\blockinput.h
+
+$(BLD)\intervals.obj : \
+ $(SRC)\intervals.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\buffer.h \
+ $(SRC)\puresize.h
+ $(CC) $(CFLAGS) -Fo$@ intervals.c
+
+$(BLD)\keyboard.obj : \
+ $(SRC)\keyboard.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\termchar.h \
+ $(SRC)\termopts.h \
+ $(SRC)\lisp.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\macros.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\disptab.h \
+ $(SRC)\keyboard.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\blockinput.h \
+ $(SRC)\msdos.h \
+ $(SRC)\syssignal.h \
+ $(EMACS_ROOT)\nt\inc\sys\ioctl.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\systty.h \
+ $(SRC)\xterm.h \
+ $(SRC)\vmstime.h \
+ $(SRC)\systime.h
+
+$(BLD)\keymap.obj : \
+ $(SRC)\keymap.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\keyboard.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\blockinput.h
+
+$(BLD)\lastfile.obj : \
+ $(SRC)\lastfile.c
+
+$(BLD)\lread.obj : \
+ $(SRC)\lread.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(EMACS_ROOT)\src\paths.h \
+ $(SRC)\commands.h \
+ $(SRC)\keyboard.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\msdos.h
+
+$(BLD)\macros.obj : \
+ $(SRC)\macros.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\macros.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\window.h
+
+$(BLD)\marker.obj : \
+ $(SRC)\marker.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h
+
+$(BLD)\minibuf.obj : \
+ $(SRC)\minibuf.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\syntax.h
+
+$(BLD)\mocklisp.obj : \
+ $(SRC)\mocklisp.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h
+
+$(BLD)\nt.obj : \
+ $(SRC)\nt.c \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(SRC)\lisp.h \
+ $(EMACS_ROOT)\nt\inc\pwd.h \
+ $(SRC)\ntheap.h
+
+$(BLD)\ntheap.obj : \
+ $(SRC)\ntheap.c \
+ $(SRC)\ntheap.h
+
+$(BLD)\ntinevt.obj : \
+ $(SRC)\ntinevt.c \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\frame.h \
+ $(SRC)\blockinput.h \
+ $(SRC)\termhooks.h
+
+$(BLD)\ntproc.obj : \
+ $(SRC)\ntproc.c \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\nt.h \
+ $(SRC)\vmstime.h \
+ $(SRC)\systime.h
+
+$(BLD)\ntterm.obj : \
+ $(SRC)\ntterm.c \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\frame.h \
+ $(SRC)\disptab.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\ntinevt.h
+
+$(BLD)\prefix-args.obj : \
+ $(SRC)\prefix-args.c
+
+$(BLD)\print.obj : \
+ $(SRC)\print.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\process.h \
+ $(SRC)\termchar.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h
+
+$(BLD)\process.obj : \
+ $(SRC)\process.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\ioctl.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\systty.h \
+ $(SRC)\window.h \
+ $(SRC)\buffer.h \
+ $(SRC)\process.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\commands.h \
+ $(SRC)\frame.h \
+ $(SRC)\syssignal.h \
+ $(SRC)\vmsproc.h \
+ $(SRC)\syswait.h \
+ $(SRC)\lisp.h \
+ $(SRC)\vmstime.h \
+ $(SRC)\systime.h \
+ $(SRC)\termopts.h
+
+$(BLD)\ralloc.obj : \
+ $(SRC)\ralloc.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(SRC)\getpagesize.h
+
+$(BLD)\regex.obj : \
+ $(SRC)\regex.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\s\s-windowsnt.h \
+ $(SRC)\m\m-windowsnt.h \
+ $(SRC)\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\syntax.h \
+ $(SRC)\regex.h
+
+$(BLD)\scroll.obj : \
+ $(SRC)\scroll.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\termchar.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\frame.h
+
+$(BLD)\search.obj : \
+ $(SRC)\search.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\syntax.h \
+ $(SRC)\buffer.h \
+ $(SRC)\commands.h \
+ $(SRC)\blockinput.h \
+ $(SRC)\regex.h
+
+$(BLD)\sunfns.obj : \
+ $(SRC)\sunfns.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\window.h \
+ $(SRC)\buffer.h \
+ $(SRC)\termhooks.h
+
+$(BLD)\syntax.obj : \
+ $(SRC)\syntax.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\commands.h \
+ $(SRC)\buffer.h \
+ $(SRC)\syntax.h
+
+$(BLD)\sysdep.obj : \
+ $(SRC)\sysdep.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\blockinput.h \
+ $(SRC)\dosfns.h \
+ $(SRC)\msdos.h \
+ $(EMACS_ROOT)\nt\inc\sys\param.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(EMACS_ROOT)\nt\inc\sys\ioctl.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h \
+ $(SRC)\systty.h \
+ $(SRC)\vmsproc.h \
+ $(SRC)\syswait.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\termchar.h \
+ $(SRC)\termopts.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\process.h \
+ $(SRC)\vmsdir.h \
+ $(SRC)\ndir.h \
+ $(SRC)\syssignal.h \
+ $(SRC)\vmstime.h \
+ $(SRC)\systime.h \
+ $(SRC)\uaf.h \
+ $(SRC)\vms-pwd.h \
+ $(EMACS_ROOT)\src\acldef.h \
+ $(EMACS_ROOT)\src\chpdef.h
+
+$(BLD)\term.obj : \
+ $(SRC)\term.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\termchar.h \
+ $(SRC)\termopts.h \
+ $(SRC)\cm.h \
+ $(SRC)\lisp.h \
+ $(SRC)\frame.h \
+ $(SRC)\disptab.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\keyboard.h
+
+$(BLD)\termcap.obj : \
+ $(SRC)\termcap.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(EMACS_ROOT)\nt\inc\sys\file.h
+
+$(BLD)\terminfo.obj : \
+ $(SRC)\terminfo.c
+
+$(BLD)\textprop.obj : \
+ $(SRC)\textprop.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h \
+ $(SRC)\buffer.h \
+ $(SRC)\window.h
+
+$(BLD)\tparam.obj : \
+ $(SRC)\tparam.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h
+
+$(BLD)\undo.obj : \
+ $(SRC)\undo.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\commands.h
+
+$(BLD)\unexnt.obj : \
+ $(SRC)\unexnt.c \
+ $(SRC)\ntheap.h
+
+$(BLD)\widget.obj : \
+ $(SRC)\widget.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\xterm.h \
+ $(SRC)\frame.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\widget.h \
+ $(SRC)\widgetprv.h
+
+$(BLD)\window.obj : \
+ $(SRC)\window.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\buffer.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\commands.h \
+ $(SRC)\indent.h \
+ $(SRC)\termchar.h \
+ $(SRC)\disptab.h \
+ $(SRC)\keyboard.h
+
+$(BLD)\xdisp.obj : \
+ $(SRC)\xdisp.c \
+ $(EMACS_ROOT)\src\s\s-windowsnt.h \
+ $(EMACS_ROOT)\src\m\m-windowsnt.h \
+ $(EMACS_ROOT)\src\config.h \
+ $(SRC)\lisp.h \
+ $(SRC)\frame.h \
+ $(SRC)\window.h \
+ $(SRC)\termchar.h \
+ $(SRC)\buffer.h \
+ $(SRC)\indent.h \
+ $(SRC)\commands.h \
+ $(SRC)\macros.h \
+ $(SRC)\disptab.h \
+ $(SRC)\termhooks.h \
+ $(SRC)\dispextern.h \
+ $(SRC)\intervals.h
diff --git a/src/s/ms-w32.h b/src/s/ms-w32.h
new file mode 100644
index 00000000000..53df90e48a3
--- /dev/null
+++ b/src/s/ms-w32.h
@@ -0,0 +1,264 @@
+/* System description file for Windows NT.
+ Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+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. */
+
+/*
+ * Define symbols to identify the version of Unix this is.
+ * Define all the symbols that apply correctly.
+ */
+
+/* #define UNIPLUS */
+/* #define USG5 */
+/* #define USG */
+/* #define HPUX */
+/* #define UMAX */
+/* #define BSD4_1 */
+/* #define BSD4_2 */
+/* #define BSD4_3 */
+/* #define BSD */
+/* #define VMS */
+#ifndef WINDOWSNT
+#define WINDOWSNT
+#endif
+#ifndef DOS_NT
+#define DOS_NT /* MSDOS or WINDOWSNT */
+#endif
+
+/* 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
+#define HAVE_FREXP
+#define HAVE_FMOD
+
+/* NOMULTIPLEJOBS should be defined if your system's shell
+ does not have "job control" (the ability to stop a program,
+ run some other program, then continue the first one). */
+
+/* #define NOMULTIPLEJOBS */
+
+/* Emacs can read input using SIGIO and buffering characters itself,
+ or using CBREAK mode and making C-g cause SIGINT.
+ The choice is controlled by the variable interrupt_input.
+
+ Define INTERRUPT_INPUT to make interrupt_input = 1 the default (use SIGIO)
+
+ Emacs uses the presence or absence of the SIGIO macro to indicate
+ whether or not signal-driven I/O is possible. It uses
+ INTERRUPT_INPUT to decide whether to use it by default.
+
+ SIGIO can be used only on systems that implement it (4.2 and 4.3).
+ CBREAK mode has two disadvantages
+ 1) At least in 4.2, it is impossible to handle the Meta key properly.
+ I hear that in system V this problem does not exist.
+ 2) Control-G causes output to be discarded.
+ I do not know whether this can be fixed in system V.
+
+ Another method of doing input is planned but not implemented.
+ It would have Emacs fork off a separate process
+ to read the input and send it to the true Emacs process
+ through a pipe. */
+
+#define INTERRUPT_INPUT
+
+/* 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_TERMIOS if the system provides POSIX-style
+ * functions and macros for terminal control.
+ *
+ * Define HAVE_TERMIO if the system provides sysV-style ioctls
+ * for terminal control.
+ *
+ * Do not define both. HAVE_TERMIOS is preferred, if it is
+ * supported on your system.
+ */
+
+/* #define HAVE_TERMIOS */
+/* #define HAVE_TERMIO */
+
+/*
+ * Define HAVE_TIMEVAL if the system supports the BSD style clock values.
+ * Look in <sys/time.h> for a timeval structure.
+ */
+
+/* #define HAVE_TIMEVAL */
+
+/*
+ * Define HAVE_SELECT if the system supports the `select' system call.
+ */
+
+/* #define HAVE_SELECT */
+
+/*
+ * Define HAVE_PTYS if the system supports pty devices.
+ */
+
+/* #define HAVE_PTYS */
+
+/*
+ * Define NONSYSTEM_DIR_LIBRARY to make Emacs emulate
+ * The 4.2 opendir, etc., library functions.
+ */
+
+/* #define NONSYSTEM_DIR_LIBRARY */
+
+/* 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) memcpy(d, s, l)
+#define bcmp(a, b, l) memcmp(a, b, l)
+
+/* subprocesses should be defined if you want to
+ have code for asynchronous subprocesses
+ (as used in M-x compile and M-x shell).
+ This is generally OS dependent, and not supported
+ under most USG systems. */
+
+#define subprocesses
+
+/* If your system uses COFF (Common Object File Format) then define the
+ preprocessor symbol "COFF". */
+
+#define COFF
+
+/* 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 CLASH_DETECTION if you want lock files to be written
+ so that Emacs can tell instantly when you try to modify
+ a file that someone else has modified in his Emacs. */
+
+/* #define CLASH_DETECTION */
+
+/* Define this if your operating system declares signal handlers to
+ have a type other than the usual. `The usual' is `void' for ANSI C
+ systems (i.e. when the __STDC__ macro is defined), and `int' for
+ pre-ANSI systems. If you're using GCC on an older system, __STDC__
+ will be defined, but the system's include files will still say that
+ signal returns int or whatever; in situations like that, define
+ this to be what the system's include files want. */
+/* #define SIGTYPE int */
+
+/* If the character used to separate elements of the executable path
+ is not ':', #define this to be the appropriate character constant. */
+#define SEPCHAR ';'
+
+/* ============================================================ */
+
+/* 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). */
+
+/* Some compilers tend to put everything declared static
+ into the initialized data area, which becomes pure after dumping Emacs.
+ On these systems, you must #define static as nothing to foil this.
+ Note that emacs carefully avoids static vars inside functions. */
+
+/* Define this to be the separator between path elements */
+#define DIRECTORY_SEP '\\'
+
+/* 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. */
+#define NULL_DEVICE "NUL:"
+#define EXEC_SUFFIXES ".exe:.com:.bat:"
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN _MAX_PATH
+#endif
+
+#define HAVE_DUP2 1
+#define HAVE_RENAME 1
+#define HAVE_RMDIR 1
+#define HAVE_MKDIR 1
+#define HAVE_GETHOSTNAME 1
+
+/* These have to be defined because our compilers treat __STDC__ as being
+ defined (most of them anyway). */
+
+#define access _access
+#define chdir _chdir
+#define chmod _chmod
+#define close _close
+#define creat _creat
+#define dup _dup
+#define dup2 _dup2
+#define execlp _execlp
+#define execvp _execvp
+#define getpid _getpid
+#define index strchr
+#define isatty _isatty
+#define link _link
+#define lseek _lseek
+#define mkdir _mkdir
+#define mktemp _mktemp
+#define open _open
+#define pipe _pipe
+#define random rand
+#define read _read
+#define rmdir _rmdir
+#define sleep nt_sleep
+#define srandom srand
+#define unlink _unlink
+#define umask _umask
+#define write _write
+#define _longjmp longjmp
+#define spawnve win32_spawnve
+#define wait win32_wait
+#define signal win32_signal
+#define rindex strrchr
+
+/* 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 */
+#define SIGKILL 9 /* Die, die die */
+#define SIGPIPE 13 /* Write on pipe with no readers */
+#define SIGALRM 14 /* Alarm */
+#define SIGCHLD 18 /* Death of child */
+
+/* For integration with MSDOS support. */
+#define getdisk() (_getdrive () - 1)
+#define getdefdir(_drv, _buf) _getdcwd (_drv, _buf, MAXPATHLEN)
+
+/* 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
+
+/* ============================================================ */
diff --git a/src/w32.c b/src/w32.c
new file mode 100644
index 00000000000..2a091d41ae2
--- /dev/null
+++ b/src/w32.c
@@ -0,0 +1,610 @@
+/* Utility and Unix shadow routines for GNU Emacs on Windows NT.
+ Copyright (C) 1994 Free Software Foundation, Inc.
+
+ This file is part of GNU Emacs.
+
+ GNU Emacs is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 1, or (at your option) any later
+ version.
+
+ GNU Emacs is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the 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.
+
+ Geoff Voelker (voelker@cs.washington.edu) 7-29-94
+*/
+
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+#include <ctype.h>
+
+#include "config.h"
+#define getwd _getwd
+#include "lisp.h"
+#undef getwd
+
+#include <pwd.h>
+
+#include "ndir.h"
+#include "ntheap.h"
+
+extern int report_file_error (char *, Lisp_Object);
+
+/* Get the current working directory. */
+int
+getwd (char *dir)
+{
+ return GetCurrentDirectory (MAXPATHLEN, dir);
+}
+
+/* Emulate gethostname. */
+int
+gethostname (char *buffer, int size)
+{
+ /* NT only allows small host names, so the buffer is
+ certainly large enough. */
+ return !GetComputerName (buffer, &size);
+}
+
+/* Emulate getloadavg. */
+int
+getloadavg (double loadavg[], int nelem)
+{
+ int i;
+
+ /* A faithful emulation is going to have to be saved for a rainy day. */
+ for (i = 0; i < nelem; i++)
+ {
+ loadavg[i] = 0.0;
+ }
+ return i;
+}
+
+/* Emulate sleep...we could have done this with a define, but that
+ would necessitate including windows.h in the files that used it.
+ This is much easier. */
+void
+nt_sleep (int seconds)
+{
+ Sleep (seconds * 1000);
+}
+
+/* Emulate the Unix directory procedures opendir, closedir,
+ and readdir. We can't use the procedures supplied in sysdep.c,
+ so we provide them here. */
+
+struct direct dir_static; /* simulated directory contents */
+static int dir_finding;
+static HANDLE dir_find_handle;
+
+DIR *
+opendir (char *filename)
+{
+ DIR *dirp;
+
+ /* Opening is done by FindFirstFile. However, a read is inherent to
+ this operation, so we have a flag to handle the open at read
+ time. This flag essentially means "there is a find-handle open and
+ it needs to be closed." */
+
+ if (!(dirp = (DIR *) malloc (sizeof (DIR))))
+ {
+ return 0;
+ }
+
+ dirp->dd_fd = 0;
+ dirp->dd_loc = 0;
+ dirp->dd_size = 0;
+
+ /* This is tacky, but we need the directory name for our
+ implementation of readdir. */
+ strncpy (dirp->dd_buf, filename, DIRBLKSIZ);
+ return dirp;
+}
+
+void
+closedir (DIR *dirp)
+{
+ /* If we have a find-handle open, close it. */
+ if (dir_finding)
+ {
+ FindClose (dir_find_handle);
+ dir_finding = 0;
+ }
+ xfree ((char *) dirp);
+}
+
+struct direct *
+readdir (DIR *dirp)
+{
+ WIN32_FIND_DATA find_data;
+
+ /* If we aren't dir_finding, do a find-first, otherwise do a find-next. */
+ if (!dir_finding)
+ {
+ char filename[MAXNAMLEN + 3];
+ int ln;
+
+ strncpy (filename, dirp->dd_buf, MAXNAMLEN);
+ ln = strlen (filename)-1;
+ if (filename[ln] != '\\' && filename[ln] != ':')
+ strcat (filename, "\\");
+ strcat (filename, "*.*");
+
+ dir_find_handle = FindFirstFile (filename, &find_data);
+
+ if (dir_find_handle == INVALID_HANDLE_VALUE)
+ return NULL;
+
+ dir_finding = 1;
+ }
+ else
+ {
+ if (!FindNextFile (dir_find_handle, &find_data))
+ return NULL;
+ }
+
+ /* Don't return . or .. since it doesn't look like any of the
+ readdir calling code expects them. */
+ while (strcmp (find_data.cFileName, ".") == 0
+ || strcmp (find_data.cFileName, "..") == 0)
+ {
+ if (!FindNextFile (dir_find_handle, &find_data))
+ return 0;
+ }
+
+ /* NT's unique ID for a file is 64 bits, so we have to fake it here.
+ This should work as long as we never use 0. */
+ dir_static.d_ino = 1;
+
+ dir_static.d_reclen = sizeof (struct direct) - MAXNAMLEN + 3 +
+ dir_static.d_namlen - dir_static.d_namlen % 4;
+
+ dir_static.d_namlen = strlen (find_data.cFileName);
+ strncpy (dir_static.d_name, find_data.cFileName, MAXNAMLEN);
+
+ return &dir_static;
+}
+
+/* Emulate getpwuid and getpwnam. */
+
+int getuid (); /* forward declaration */
+
+static char the_passwd_name[256];
+static char the_passwd_passwd[256];
+static char the_passwd_gecos[256];
+static char the_passwd_dir[256];
+static char the_passwd_shell[256];
+
+static struct passwd the_passwd =
+{
+ the_passwd_name,
+ the_passwd_passwd,
+ 0,
+ 0,
+ 0,
+ the_passwd_gecos,
+ the_passwd_dir,
+ the_passwd_shell,
+};
+
+struct passwd *
+getpwuid (int uid)
+{
+ int size = 256;
+
+ if (!GetUserName (the_passwd.pw_name, &size))
+ return NULL;
+
+ the_passwd.pw_passwd[0] = '\0';
+ the_passwd.pw_uid = 0;
+ the_passwd.pw_gid = 0;
+ strcpy (the_passwd.pw_gecos, the_passwd.pw_name);
+ the_passwd.pw_dir[0] = '\0';
+ the_passwd.pw_shell[0] = '\0';
+
+ return &the_passwd;
+}
+
+struct passwd *
+getpwnam (char *name)
+{
+ struct passwd *pw;
+
+ pw = getpwuid (getuid ());
+ if (!pw)
+ return pw;
+
+ if (strcmp (name, pw->pw_name))
+ return NULL;
+
+ return pw;
+}
+
+
+/* We don't have scripts to automatically determine the system configuration
+ for Emacs before it's compiled, and we don't want to have to make the
+ user enter it, so we define EMACS_CONFIGURATION to invoke this runtime
+ routine. */
+
+static char configuration_buffer[16];
+
+char *
+get_emacs_configuration (void)
+{
+ char *arch, *oem;
+
+ /* Determine the processor type. */
+ switch (get_processor_type ())
+ {
+ case PROCESSOR_INTEL_386:
+ case PROCESSOR_INTEL_486:
+ case PROCESSOR_INTEL_PENTIUM:
+ arch = "i386";
+ break;
+ case PROCESSOR_INTEL_860:
+ arch = "i860";
+ break;
+ case PROCESSOR_MIPS_R2000:
+ case PROCESSOR_MIPS_R3000:
+ case PROCESSOR_MIPS_R4000:
+ arch = "mips";
+ break;
+ case PROCESSOR_ALPHA_21064:
+ arch = "alpha";
+ break;
+ default:
+ arch = "unknown";
+ break;
+ }
+
+ /* Let oem be "*" until we figure out how to decode the OEM field. */
+ oem = "*";
+
+ sprintf (configuration_buffer, "%s-%s-nt%d.%d", arch, oem,
+ get_nt_major_version (), get_nt_minor_version ());
+ return configuration_buffer;
+}
+
+/* Conjure up inode and device numbers that will serve the purpose
+ of Emacs. Return 1 upon success, 0 upon failure. */
+int
+get_inode_and_device_vals (Lisp_Object filename, Lisp_Object *p_inode,
+ Lisp_Object *p_device)
+{
+ /* File uids on NT are found using a handle to a file, which
+ implies that it has been opened. Since we want to be able
+ to stat an arbitrary file, we must open it, get the info,
+ and then close it.
+
+ Also, NT file uids are 64-bits. This is a problem. */
+
+ HANDLE handle;
+ BOOL result;
+ BY_HANDLE_FILE_INFORMATION info;
+
+ /* FIXME: It shouldn't be opened without READ access, but NT on x86
+ doesn't allow GetFileInfo in that case (NT on mips does). */
+
+ handle = CreateFile (XSTRING (filename)->data,
+ GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (handle == INVALID_HANDLE_VALUE)
+ return 0;
+
+ result = GetFileInformationByHandle (handle, &info);
+ CloseHandle (handle);
+ if (!result)
+ return 0;
+
+ *p_inode = make_number (info.nFileIndexLow); /* use the low value */
+ *p_device = make_number (info.dwVolumeSerialNumber);
+
+ return 1;
+}
+
+/* The following pipe routines are used to support our fork emulation.
+ Since NT's crt dup always creates inherited handles, we
+ must be careful in setting up pipes. First create
+ non-inherited pipe handles, then create an inherited handle
+ to the write end by dup-ing it, and then close the non-inherited
+ end that was just duped. This gives us one non-inherited handle
+ on the read end and one inherited handle to the write end. As
+ the parent, we close the inherited handle to the write end after
+ spawning the child. */
+
+/* From callproc.c */
+extern Lisp_Object Vbinary_process_input;
+extern Lisp_Object Vbinary_process_output;
+
+void
+pipe_with_inherited_out (int fds[2])
+{
+ int inherit_out;
+ unsigned int flags = _O_NOINHERIT;
+
+ if (!NILP (Vbinary_process_output))
+ flags |= _O_BINARY;
+
+ _pipe (fds, 0, flags);
+ inherit_out = dup (fds[1]);
+ close (fds[1]);
+ fds[1] = inherit_out;
+}
+
+void
+pipe_with_inherited_in (int fds[2])
+{
+ int inherit_in;
+ unsigned int flags = _O_NOINHERIT;
+
+ if (!NILP (Vbinary_process_input))
+ flags |= _O_BINARY;
+
+ _pipe (fds, 0, flags);
+ inherit_in = dup (fds[0]);
+ close (fds[0]);
+ fds[0] = inherit_in;
+}
+
+/* The following two routines are used to manipulate stdin, stdout, and
+ stderr of our child processes.
+
+ Assuming that in, out, and err are inherited, we make them stdin,
+ stdout, and stderr of the child as follows:
+
+ - Save the parent's current standard handles.
+ - Set the parent's standard handles to the handles being passed in.
+ (Note that _get_osfhandle is an io.h procedure that
+ maps crt file descriptors to NT file handles.)
+ - Spawn the child, which inherits in, out, and err as stdin,
+ stdout, and stderr. (see Spawnve)
+ - Reset the parent's standard handles to the saved handles.
+ (see reset_standard_handles)
+ We assume that the caller closes in, out, and err after calling us. */
+
+void
+prepare_standard_handles (int in, int out, int err, HANDLE handles[4])
+{
+ HANDLE parent, stdin_save, stdout_save, stderr_save, err_handle;
+
+ parent = GetCurrentProcess ();
+ if (!DuplicateHandle (parent,
+ GetStdHandle (STD_INPUT_HANDLE),
+ parent,
+ &stdin_save,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS))
+ report_file_error ("Duplicating parent's input handle", Qnil);
+
+ if (!DuplicateHandle (parent,
+ GetStdHandle (STD_OUTPUT_HANDLE),
+ parent,
+ &stdout_save,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS))
+ report_file_error ("Duplicating parent's output handle", Qnil);
+
+ if (!DuplicateHandle (parent,
+ GetStdHandle (STD_ERROR_HANDLE),
+ parent,
+ &stderr_save,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS))
+ report_file_error ("Duplicating parent's error handle", Qnil);
+
+ if (!SetStdHandle (STD_INPUT_HANDLE, (HANDLE) _get_osfhandle (in)))
+ report_file_error ("Changing stdin handle", Qnil);
+
+ if (!SetStdHandle (STD_OUTPUT_HANDLE, (HANDLE) _get_osfhandle (out)))
+ report_file_error ("Changing stdout handle", Qnil);
+
+ /* We lose data if we use the same handle to the pipe for stdout and
+ stderr, so make a duplicate. This took a while to find. */
+ if (out == err)
+ {
+ if (!DuplicateHandle (parent,
+ (HANDLE) _get_osfhandle (err),
+ parent,
+ &err_handle,
+ 0,
+ TRUE,
+ DUPLICATE_SAME_ACCESS))
+ report_file_error ("Duplicating out handle to make err handle.",
+ Qnil);
+ }
+ else
+ {
+ err_handle = (HANDLE) _get_osfhandle (err);
+ }
+
+ if (!SetStdHandle (STD_ERROR_HANDLE, err_handle))
+ report_file_error ("Changing stderr handle", Qnil);
+
+ handles[0] = stdin_save;
+ handles[1] = stdout_save;
+ handles[2] = stderr_save;
+ handles[3] = err_handle;
+}
+
+void
+reset_standard_handles (int in, int out, int err, HANDLE handles[4])
+{
+ HANDLE stdin_save = handles[0];
+ HANDLE stdout_save = handles[1];
+ HANDLE stderr_save = handles[2];
+ HANDLE err_handle = handles[3];
+
+ if (!SetStdHandle (STD_INPUT_HANDLE, stdin_save))
+ report_file_error ("Resetting input handle", Qnil);
+
+ if (!SetStdHandle (STD_OUTPUT_HANDLE, stdout_save))
+ report_file_error ("Resetting output handle", Qnil);
+
+ if (!SetStdHandle (STD_ERROR_HANDLE, stderr_save))
+ report_file_error ("Resetting error handle", Qnil);
+
+ if (out == err)
+ {
+ /* If out and err are the same handle, then we duplicated out
+ and stuck it in err_handle. Close the duplicate to clean up. */
+ if (!CloseHandle (err_handle))
+ report_file_error ("Closing error handle duplicated from out.",
+ Qnil);
+ }
+}
+
+/* Destructively turn backslashes into slashes. */
+void
+dostounix_filename (p)
+ register char *p;
+{
+ while (*p)
+ {
+ if (*p == '\\')
+ *p = '/';
+ p++;
+ }
+}
+
+/* Routines that are no-ops on NT but are defined to get Emacs to compile. */
+
+
+int
+sigsetmask (int signal_mask)
+{
+ return 0;
+}
+
+int
+sigblock (int sig)
+{
+ return 0;
+}
+
+int
+kill (int pid, int signal)
+{
+ return 0;
+}
+
+int
+setpgrp (int pid, int gid)
+{
+ return 0;
+}
+
+int
+alarm (int seconds)
+{
+ return 0;
+}
+
+int
+unrequest_sigio (void)
+{
+ return 0;
+}
+
+int
+request_sigio (void)
+{
+ return 0;
+}
+
+int
+getuid ()
+{
+ return 0;
+}
+
+int
+geteuid ()
+{
+ return 0;
+}
+
+/* Remove all CR's that are followed by a LF.
+ (From msdos.c...probably should figure out a way to share it,
+ although this code isn't going to ever change.) */
+int
+crlf_to_lf (n, buf)
+ register int n;
+ register unsigned char *buf;
+{
+ unsigned char *np = buf;
+ unsigned char *startp = buf;
+ unsigned char *endp = buf + n;
+
+ if (n == 0)
+ return n;
+ while (buf < endp - 1)
+ {
+ if (*buf == 0x0d)
+ {
+ if (*(++buf) != 0x0a)
+ *np++ = 0x0d;
+ }
+ else
+ *np++ = *buf++;
+ }
+ if (buf < endp)
+ *np++ = *buf++;
+ return np - startp;
+}
+
+
+#ifdef PIGSFLY
+Keep this around...we might need it later.
+#ifdef WINDOWSNT
+{
+ /*
+ * Find the user's real name by opening the process token and looking
+ * up the name associated with the user-sid in that token.
+ */
+
+ char b[256], Name[256], RefD[256];
+ DWORD length = 256, rlength = 256, trash;
+ HANDLE Token;
+ SID_NAME_USE User;
+
+ if (1)
+ Vuser_real_name = build_string ("foo");
+ else if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &Token))
+ {
+ Vuser_real_name = build_string ("unknown");
+ }
+ else if (!GetTokenInformation (Token, TokenUser, (PVOID)b, 256,
+ &trash))
+ {
+ CloseHandle (Token);
+ Vuser_real_name = build_string ("unknown");
+ }
+ else if (!LookupAccountSid ((void *)0, (PSID)b, Name, &length, RefD,
+ &rlength, &User))
+ {
+ CloseHandle (Token);
+ Vuser_real_name = build_string ("unknown");
+ }
+ else
+ Vuser_real_name = build_string (Name);
+}
+#else /* not WINDOWSNT */
+#endif /* not WINDOWSNT */
+#endif /* PIGSFLY */
diff --git a/src/w32.h b/src/w32.h
new file mode 100644
index 00000000000..f5a701dcb13
--- /dev/null
+++ b/src/w32.h
@@ -0,0 +1,50 @@
+/* Support routines for the NT version of Emacs.
+ Copyright (C) 1994 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+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. */
+
+/* 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
+#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 */
+
+/* Prepare our standard handles for proper inheritance by child processes. */
+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,
+ int err, HANDLE handles[4]);
+
diff --git a/src/w32heap.c b/src/w32heap.c
new file mode 100644
index 00000000000..aac860e769b
--- /dev/null
+++ b/src/w32heap.c
@@ -0,0 +1,198 @@
+/* Heap management routines for GNU Emacs on Windows NT.
+ Copyright (C) 1994 Free Software Foundation, Inc.
+
+ This file is part of GNU Emacs.
+
+ GNU Emacs is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ GNU Emacs is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the 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.
+
+ Geoff Voelker (voelker@cs.washington.edu) 7-29-94
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "ntheap.h"
+
+/* This gives us the page size and the size of the allocation unit on NT. */
+SYSTEM_INFO sysinfo_cache;
+
+/* These are defined to get Emacs to compile, but are not used. */
+int edata;
+int etext;
+
+/* The major and minor versions of NT. */
+int nt_major_version;
+int nt_minor_version;
+
+/* Cache information describing the NT system for later use. */
+void
+cache_system_info (void)
+{
+ union
+ {
+ struct info
+ {
+ char major;
+ char minor;
+ short platform;
+ } info;
+ DWORD data;
+ } version;
+
+ /* Cache the version of the operating system. */
+ version.data = GetVersion ();
+ nt_major_version = version.info.major;
+ nt_minor_version = version.info.minor;
+
+ /* Cache page size, allocation unit, processor type, etc. */
+ GetSystemInfo (&sysinfo_cache);
+}
+
+/* Round ADDRESS up to be aligned with ALIGN. */
+unsigned char *
+round_to_next (unsigned char *address, unsigned long align)
+{
+ unsigned long tmp;
+
+ tmp = (unsigned long) address;
+ tmp = (tmp + align - 1) / align;
+
+ return (unsigned char *) (tmp * align);
+}
+
+/* Info for keeping track of our heap. */
+unsigned char *data_region_base = NULL;
+unsigned char *data_region_end = NULL;
+unsigned long data_region_size = 0;
+
+/* The start of the data segment. */
+unsigned char *
+get_data_start (void)
+{
+ return data_region_base;
+}
+
+/* The end of the data segment. */
+unsigned char *
+get_data_end (void)
+{
+ return data_region_end;
+}
+
+/* Emulate Unix sbrk. */
+void *
+sbrk (unsigned long increment)
+{
+ void *result;
+ long size = (long) increment;
+
+ /* Allocate our heap if we haven't done so already. */
+ if (!data_region_base)
+ {
+ data_region_base = VirtualAlloc ((void *) get_data_region_base (),
+ get_reserved_heap_size (),
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ if (!data_region_base)
+ return NULL;
+
+ /* Ensure that the addresses don't use the upper 8 bits since
+ the Lisp type goes there (yucko). */
+ if (((unsigned long) data_region_base & 0xFF000000) != 0)
+ {
+ printf ("Error: The heap was allocated in upper memory.\n");
+ exit (1);
+ }
+
+ data_region_end = data_region_base;
+ data_region_size = get_reserved_heap_size ();
+ }
+
+ result = data_region_end;
+
+ /* If size is negative, shrink the heap by decommitting pages. */
+ if (size < 0)
+ {
+ size = -size;
+
+ /* Sanity checks. */
+ if (size % get_page_size () != 0)
+ return NULL;
+ if ((data_region_end - size) < data_region_base)
+ return NULL;
+
+ /* Decommit size bytes from the end of the heap. */
+ if (!VirtualFree (data_region_end - size, size, MEM_DECOMMIT))
+ return NULL;
+
+ data_region_end -= size;
+ }
+ /* If size is positive, grow the heap by committing reserved pages. */
+ else if (size > 0)
+ {
+ /* Sanity checks. */
+ if (size % get_page_size () != 0)
+ return NULL;
+ if ((data_region_end + size) >
+ (data_region_base + get_reserved_heap_size ()))
+ return NULL;
+
+ /* Commit more of our heap. */
+ if (VirtualAlloc (data_region_end, size, MEM_COMMIT,
+ PAGE_READWRITE) == NULL)
+ return NULL;
+ data_region_end += size;
+ }
+
+ return result;
+}
+
+/* Recreate the heap from the data that was dumped to the executable.
+ EXECUTABLE_PATH tells us where to find the executable. */
+void
+recreate_heap (char *executable_path)
+{
+ unsigned char *tmp;
+
+ /* First reserve the upper part of our heap. (We reserve first
+ because there have been problems in the past where doing the
+ mapping first has loaded DLLs into the VA space of our heap.) */
+ tmp = VirtualAlloc ((void *) get_heap_end (),
+ get_reserved_heap_size () - get_committed_heap_size (),
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ if (!tmp)
+ exit (1);
+
+ /* We read in the data for the .bss section from the executable
+ first and map in the heap from the executable second to prevent
+ any funny interactions between file I/O and file mapping. */
+ read_in_bss (executable_path);
+ map_in_heap (executable_path);
+}
+
+/* Round the heap up to the given alignment. */
+void
+round_heap (unsigned long align)
+{
+ unsigned long needs_to_be;
+ unsigned long need_to_alloc;
+
+ needs_to_be = (unsigned long) round_to_next (get_heap_end (), align);
+ need_to_alloc = needs_to_be - (unsigned long) get_heap_end ();
+
+ if (need_to_alloc)
+ sbrk (need_to_alloc);
+}
diff --git a/src/w32heap.h b/src/w32heap.h
new file mode 100644
index 00000000000..9cf2882bfe3
--- /dev/null
+++ b/src/w32heap.h
@@ -0,0 +1,72 @@
+/* Heap management routines (including unexec) for GNU Emacs on Windows NT.
+ Copyright (C) 1994 Free Software Foundation, Inc.
+
+ This file is part of GNU Emacs.
+
+ GNU Emacs is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ GNU Emacs is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the 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.
+
+ Geoff Voelker (voelker@cs.washington.edu) 7-29-94
+*/
+
+#ifndef NTHEAP_H_
+#define NTHEAP_H_
+
+#include <windows.h>
+
+/*
+ * Heap related stuff.
+ */
+#define get_data_region_base() (char *) 0x00030000
+#define get_reserved_heap_size() (0x00d00000 - 0x00030000)
+#define get_committed_heap_size() (get_data_end () - get_data_start ())
+#define get_heap_start() get_data_start ()
+#define get_heap_end() get_data_end ()
+#define get_page_size() sysinfo_cache.dwPageSize
+#define get_allocation_unit() sysinfo_cache.dwAllocationGranularity
+#define get_processor_type() sysinfo_cache.dwProcessorType
+#define get_nt_major_version() nt_major_version
+#define get_nt_minor_version() nt_minor_version
+
+extern unsigned char *get_data_start();
+extern unsigned char *get_data_end();
+extern unsigned long data_region_size;
+extern SYSTEM_INFO sysinfo_cache;
+extern BOOL need_to_recreate_heap;
+extern int nt_major_version;
+extern int nt_minor_version;
+
+/* Emulation of Unix sbrk(). */
+extern void *sbrk (unsigned long size);
+
+/* Recreate the heap created during dumping. */
+extern void recreate_heap (char *executable_path);
+
+/* Round the heap to this size. */
+extern void round_heap (unsigned long size);
+
+/* Load in the dumped .bss section. */
+extern void read_in_bss (char *name);
+
+/* Map in the dumped heap. */
+extern void map_in_heap (char *name);
+
+/* Cache system info, e.g., the NT page size. */
+extern void cache_system_info (void);
+
+/* Round ADDRESS up to be aligned with ALIGN. */
+extern unsigned char *round_to_next (unsigned char *address,
+ unsigned long align);
+
+#endif /* NTHEAP_H_ */